要求算法解决八皇后拼图

时间:2011-03-30 13:26:45

标签: algorithm recursion puzzle chess

  

可能重复:
  Dumb 8 Queens problem in C++

您好 我回答了这个问题 **

  

编写一个算法来打印所有方法   在国际象棋上安排8位国王   董事会让所有人都没有   行,列,对角线

**

//initialize chess[i][j] to 0;
int king=100; //any other number except 0/1

for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
//select any one position for the first column... lets start with j=0,i=0
if(chess[i][j]!=1)
chess[i][j]=king;
//now we should cross all rows with value i and column with value j
chess[i][]=1; 
print(when chess[][]=king)
// we cannot enter king if chess[][]=1

}
}

如何检查对角线部分?还有如何列举所有可能的案例?

先谢谢。

1 个答案:

答案 0 :(得分:1)

回答具体问题:

棋盘上的对角线移动总是从(m,n)到(m +/- k,n +/- k);即你在垂直方向上水平移动多个空格。因此,要检查两个皇后,一个在(i,j)和一个在(p,q)上是否对角攻击,你检查是否abs(i-p) == abs(j-q)

要划掉所有可以被女王(p,q)对角攻击的方格,你需要四个形式的循环

for (i = p, j = q; i >= 0, j >= 0; i--, j--) { board[i][j] = 1 }

for (i = p, j = q; i >= 0, j < 8; i--, j++)  { board[i][j] = 1 }

for (i = p, j = q; i < 8, j < 8; i++, j++)   { board[i][j] = 1 }

for (i = p, j = q; i < 8, j >= 0; i++, j--)  { board[i][j] = 1 }

也就是说,你走在你女王的中心的四个手臂上,穿过正方形,直到你撞到了董事会的边缘。