从n*n个格子中,放置n个皇后
皇后是国际象棋中最强的棋子,无论是横,竖,还是斜向,都是她的控制范围
我们需要把这n个皇后放置在这正方形的棋盘中,同时要求皇后之间不会相互影响
我看了二叉树的解决方式,是使用八叉树
即从根节点开始,其子节点分别在同一列放置一个皇后,同时各不相同
第二层同理,每一个一层子节点的子节点分别在每一个空格上放置一个皇后
这样有一个深度为9的8叉树。
这时需要遍历每一种情况,也就是说8!次遍历,将每一个满足条件的棋盘状态输出出来
这无疑是非常慢的。
于是我又学习了回溯法,它的思想可以一开始就将不符合条件的棋盘状态大部分剔除
学自
void queen(int row){
if(row==n)
total++;
else
for(int col=0;col!=n;col++){
c[row]=col;
if(is_ok(row))
queen(row+1);
}
}
算法是逐行安排皇后的,其参数row为现在正执行到第几行。n是皇后数,在八皇后问题里当然就是8啦。
第2行好理解,如果程序当前能正常执行到第8行,那自然是找到了一种解法,于是八皇后问题解法数加1。
如果当前还没排到第八行,则进入else语句。遍历所有列col,将当前col存储在数组c里,然后使用is_ok()