一.问题描述:
在n*n格子上放置n个皇后, 按照国际象棋规矩不可让皇后相互攻击, 即如何两个皇后不放在同一列同一行同一斜线上.
二.算法设计:
将问题转化为逐行放置皇后,即第一次放第1行,第二次放第2行,依次类推放至第n行皇后则放置完毕,如此每次放置只需考虑皇后的列冲突和斜线冲突.因为每次皇后都在新的一行放置.假设数组 x[i] 表示第i个皇后放的列数,如x[3] = 4; 表示第3个(第三行的)皇后放在第4列.
设第i行皇后放x[i]列,和第k行皇后放x[k]列,其中冲突情况有:
- 列冲突, 即x[k] = x[i]
- 斜线冲突,由于在n*n格子,则若有两个棋子属于同一斜线,则两棋子斜率为-1,可推出 | x[i]-x[k] | /| (i-k) |=1; 则 |i-k|= | (x[i]-x[k]) |
函数代码如下:
bool Queen::Place(int k)
{
for(int j=1;j<k;j++)
if( ( abs(k-j)==abs(x[j]-x[k]) ) ||(x[j]==x[k]) )//斜线冲突和列冲突
return false; //返回false
return true; //注意这里不是else执行返回true,当k与之前所有皇后冲突检测通过后</span>才返回true
}
三.解空间:
n后问题的解可以用一颗解空间树表示,其中从根节点开始对树进行深度优先搜索,
从第一个根节点开始搜索,如果找到第n+1层,则所有n后放置完毕,解决方案sum+