寒假归来,继续征程。继续总结这系列经典的游戏算法。
问题描述:
八皇后是个古老而有趣的游戏,是由高斯于1850年首先提出的。要求在国际象棋的棋盘上放置八个皇后,使其不能相互攻击,即任意两个皇后不能处于棋盘的同一行、同一列和同一条对角线上。试问有多少种放法?
基本思想:
关于八皇后的算法有很多,但我认为最好理解的还是回溯法。先把皇后放在(0,0)位置,然后把1号皇后放在(1,j)位置,使其满足要求。接着放2号皇后,依此类推。遇到某个皇后如把她无论放在该行的任意位置均不满足要求,则前一个皇后放置不当,须重新放置前一皇后,8个皇后均按要求放置好,这就是一次成功的摆法。
函数说明:
bool place(int); //判断能否放置皇后,可以返回true,否则返回false,
void backtrack(int); //回溯法求解放置过程
void print(); //打印最终的解
具体步骤:
place函数中判断能否放置皇后的条件为:不同列:x[j]!=x[k],不同斜线:abs(k-j)!=abs(x[k]-x[j]),x[i]表示第i个皇后放置在第x[i]列;
backtrack函数中,不断回溯,依次按序摆放皇后,如果可以放置则摆放下一个皇后否则将皇后放置到下一位置,若回溯完毕则输出结果。
C++代码实现: