经典游戏算法之八皇后

寒假归来,继续征程。继续总结这系列经典的游戏算法。

问题描述:

 

       八皇后是个古老而有趣的游戏,是由高斯于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++代码实现:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值