algorithm - 八皇后回溯解决方案是否需要任何排序?

标签 algorithm sorting search backtracking n-queens

嗨,我刚刚参加了最后一年的编程考试,有人问我这个问题: 用什么排序和搜索算法来解决 8 皇后问题。

如果我错了请纠正我,但根本没有排序...... 我知道在放置女王和回溯期间需要进行基本级别的搜索,但是排序从何而来?如果有的话?

下面是我一直在看但看不到的内容。

public class Queens
{
int[] positions;
int counter = 0;
boolean isFinished = false;

public Queens()
{
  positions = new int[8];
  placeQueens(0);
}

public boolean canPlaceQueen(int row, int column)
{
  for (int i = 0; i < row; i++)
  {
     if (positions[i] == column || (i - row)== (positions[i]-column) || (i-row)== (column - positions[i]))
     {
        return false;
     }
  }
  return true;
}

public void placeQueens(int row)
{
  counter++;
  printQueens();
  for (int column = 0; column < 8; column++)
  {
     if (canPlaceQueen(row, column))
     {
        positions[row] = column;
        if (row == 8-1)
        {
           System.out.println("FINAL " +counter);
           isFinished = true;
           printQueens();
        }
        else if(!isFinished)
        {
           placeQueens(row+1);
        }
     }
  }
}


public void printQueens()
{
  for (int i = 0; i < 8; i++)
  {
      for (int j = 0; j< 8; j++)
      {
         if (positions[i] == j)
         {
            System.out.print("Q ");
         }
         else
         {
            System.out.print("* ");
         }
      }
      System.out.println();
  }
  System.out.println();
}
}

最佳答案

我认为在这种情况下,您误解了“排序”的含义。为了使回溯起作用,您需要以某种可预测的顺序分析头寸。如果您的算法没有按设定顺序分析头寸,那么当您“修剪”一组头寸时,您可能已经修剪了一个有效头寸。没有这种“排序”或树状结构的位置回溯不起作用。但是,您不需要预先对一组位置或类似的东西进行排序。事实上,这会破坏回溯的目的。

这个想法是,甚至不需要建立一些职位组合。一旦发现冲突,就不再考虑涉及该组合的所有迭代。问题在于构建这些组合的顺序,而不是提前对它们进行排序。所有组合都必须按正确的顺序构建和考虑。这让你知道当我们放弃一个“分支”时,建立在这个分支上的所有组合与我们刚刚拒绝的选项一样(甚至更糟)不正确,否则你可以“过度修剪”你的结果集,并且错过一个合适的组合。但不需要 NlogN 排序算法。至少在 n 皇后问题的例子中不是。事实上,如果您预先构建所有位置并对其进行排序,您将完全忽略允许我们大大加快此问题计算速度的动态编程元素。

http://en.wikipedia.org/wiki/Backtracking

关于algorithm - 八皇后回溯解决方案是否需要任何排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16675146/

相关文章:

c++ - iter_swap 可以专门化吗?

java - 本地排序还是重新查询?

c# - 如何在 Unity 中高效地对大量 RGB 颜色进行排序

iOS Objective-C 如何使用谓词在字符串数组中搜索多个非连续关键字?

algorithm - 在 LaTeX 算法环境中格式化注释

vb.net - 抽奖算法

sql - Postgres 全文搜索 : how to search multiple words in multiple fields?

javascript - 精确字符串匹配文件名数组 JavaScript/Nodejs

database - 存储路线数据

python - 在python中按值对defaultdict进行排序