int placement[] = new int[8];
int placeQueen(int row)
{
if(row == 8)
{
printBoard();
return;
}
for(int i = 0; i<8; i++)
{
placement[row] = i;
if(check(row))
{
placeQueen(row + 1); \\This step
}
}
}
boolean check(int row)
{
for(int i = 0; i<row; i++)
{
int diff = Math.abs(placement[row] - placement[i]);
if(diff == 0 || (diff == row - i))
{
return false;
}
}
return true;
}
我完全没有得到的是递归在for循环中的工作原理。
答案 0 :(得分:6)
此算法对行进行递归。它尝试在行r
上添加一个女王,它可能位于该行的八个位置。尝试这个就足够了,因为如果两个皇后被放在同一行上,你就会违反没有两个皇后可以相互攻击的条件。
由于一次放置一个女王,因此check
功能仅检查新放置的女王不能攻击任何先前放置的女王就足够了。 diff == 0
确保新女王与以前任何一个女王的位置不同。 diff == row - i
确保新女王不会沿着对角线的移动攻击另一个女王。 (由于上一行中的Math.abs(),这会捕获两个对角线移动。)
所以,再次: 尝试一次放置一个女王,看看它是否能攻击其他任何一个。如果可以的话,立即返回 - 否则尝试以可能的方式在下一行添加女王。