八皇后问题

八皇后问题是一个经典的回溯算法应用,目标是在8x8棋盘上放置8个皇后,使得它们不互相攻击。文章介绍了问题背景、解决方案,并提到了避免皇后在同一行、列或斜线上的条件。通过一维数组模拟二维棋盘,利用回溯法找出所有可能的摆法。代码示例展示了具体实现过程。
摘要由CSDN通过智能技术生成

        八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。
        问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题。

        来提取一下重要信息,任意两个皇后,

  1. 不能处于同一行。
  2. 同一列。
  3. 同一斜线上。

        不能处于同一行,跟同一列只需要让,一行里只有一个棋子,一列里,只有一个棋子就好,斜线如何处理呢?假设n是当前皇后,i是对比的皇后,如果n-i的绝对值等于n皇后的列数-i皇后的列数的绝对值这样n皇后跟i皇后就处于同一斜线上。(网上抄的)(其实就是n皇后跟i皇后之间相差的行数和列数不能相等,相等的话就是一个等腰直角三角形,必定处于同一直线)

        使用一维数组也可以实现二维数组的效果:

checkerboard[i]={val,val,...}; i表示行  val表示列

至于是如何回溯的,可以自己debug看看,数组快成{0 , 4, 7, 5, 2, 6, 1, 3},慢慢看。

代码如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值