回溯 皇后 算法笔记_八皇后问题的C语言简单解法

a5afe35a49f4f822bdbcf3d925ec53e4.png

所谓八皇后问题,就是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。民间俗称八妃问题(误)

知乎上看到大佬们都是在努力20行代码内解决八皇后问题,让一直以来对这个问题束手无策的我挫败感倍增。最初尝试时候发现很明显不能用简单的暴力模拟或者递归大法,必须要设计一个简单合理的逻辑操作。那么这勾心斗角的八个妃子的安排到底应该如何呢?最近终于自己用C语言也解决了这个问题,代码相对还是比较繁琐,只是根据自己简单的逻辑构建了这个解决方法。分享一下。

一 理解八皇后问题

在一个8*8的棋盘上,我们首先可以任意放置一个皇后,如图,蓝色代表已经被皇后占领的方格,红色代表这个皇后的控制范围,显而易见另一个皇后的选择范围小了很多,此时放置第二位皇后在(2,3)处,得到结果如下,但是同时我们注意到,第一个皇后有64种放法,对于她(1,1)位置的一种放法,第二位皇后有42种选择。庞大的数据量已经难以直接再递推下去了。

1762bc16faad043da7ffe2aa9ff9dc13.png
开始放第一个皇后时候

93d190b275140f472a10094e01407f39.png
接着放了第二个皇后

二 解决八皇后问题

接下来可以用代码直接模拟问题的基本情况。按图索骥创建8*8二维整型数组,数组为0认为空闲不被其他皇后攻击位置,否则不可使用,同时我们这里还需要一个三维数组可以设置为100*8*8 (b[100][8][8])。下面说一下代码思路。

对于每一种放置结果都会影响到下一次选择的情况下,最显而易见的是吧前后的结果全部都组合起来,一条路走下去,当放置到最后,检查棋盘上是不是已经有了八个皇后,出现八个说明本次放置得到一种正确结果计数器加一,否则就放弃本次结果开始下一次循环。

注意向上返回后一定要放置到下一个点,不然会死循环。

函数基本功能要求:

1.要有函数在最初循环迭代进入,即放置第一个皇后。

2.递归体函数,这个函数不断调用自己,把每一个可用的点都试验一遍,不需要返回值。

3.检查函数,在递归体内部执行,如果八个皇后全部到位,把此时得到的二维数组数据拿到三维数组中去比对,如果三维数组中没有和它重复的就把这个二维数组放置到这个三维数组中,否则取消这个结果,继续循环递归。

4.排除函数,这个函数的意义比较简单,就是每一次放置了皇后之后,把这个皇后的攻击范围全部变成非空状态,防止再被使用。

因为实际操作是很简单的,在这里就不给小伙伴们贴代码了。

根据这些函数的功能再做一些合适的联系就能轻而易举借助计算机解决古老的八皇后问题。当然,这只是个简单的思路而已。希望同学们亲自尝试一下,源代码我已经上传到微信公众号“醉编程玩家”,后台回复关键字“八皇后”即可获取,谢谢观看!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值