嗨,我刚刚参加了最后一年的编程考试,我被问到这个问题: 什么排序和搜索算法用于解决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();
}
}
答案 0 :(得分:1)
我认为在这种情况下你会误解“排序”的含义。为了使回溯工作,您需要以某种可预测的顺序分析位置。如果您的算法没有按设定顺序分析位置,那么当您“修剪”一组位置时,您可能已经修剪了有效位置。没有这种“排序”或树状结构的位置回溯不起作用。但是,您不需要预先排序一组位置或类似的东西。事实上,这将破坏回溯的目的。
这个想法是,甚至不需要建立一些职位组合。一旦发现冲突,就不再考虑涉及该组合的所有迭代。构建这些组合的顺序是一个问题,而不是提前对它们进行排序。必须建立所有组合并在适当的oder中考虑。这允许你知道我们什么时候放弃“分支”,这个分支上构建的所有组合都会同样(甚至更糟)不正确,因为我们只是拒绝了,否则你可以“过度修剪”你的结果集,并且想念一个合适的组合。但是不需要NlogN排序算法。至少在n-queens问题的例子中没有。实际上,如果你预先构建了所有位置并对它们进行了排序,那么你完全忽略了动态编程元素,这些元素使我们能够大大加快这个问题的计算速度。