八字带八绝数组怎么化解 什么是八绝数组( 二 )


八字带八绝数组怎么化解 什么是八绝数组

文章插图

4.第四层递归,尝试在第四行摆放第四个皇后(第一格被第二个皇后封锁,只能落在第二格):
八字带八绝数组怎么化解 什么是八绝数组

文章插图

5.第五层递归,尝试在第五行摆放第五个皇后(前三格被前面的皇后封锁,只能落在第四格):
八字带八绝数组怎么化解 什么是八绝数组

文章插图

6.由于所有格子都“绿了”,第六行已经没办法摆放皇后,于是进行回溯,重新摆放第五个皇后到第八格 。:
八字带八绝数组怎么化解 什么是八绝数组

文章插图

7.第六行仍然没有办法摆放皇后,第五行也已经尝试遍了,于是回溯到第四行,重新摆放第四个皇后到第七格 。:
八字带八绝数组怎么化解 什么是八绝数组

文章插图

8.继续摆放第五个皇后,以此类推......
八字带八绝数组怎么化解 什么是八绝数组

文章插图

八字带八绝数组怎么化解 什么是八绝数组

文章插图

八皇后问题的代码实现?
解决八皇后问题,可以分为两个层面:
1.找出第一种正确摆放方式,也就是深度优先遍历 。
2.找出全部的正确摆放方式,也就是广度优先遍历 。
由于篇幅优先,我们本篇只介绍如何找出第一种正确摆放方式 。
在研究代码实现的时候,我们需要解决几个问题:
1.国际象棋的棋盘如何表示?
很简单,用一个长度是8的二维数组来表示即可 。
八字带八绝数组怎么化解 什么是八绝数组

文章插图

由于这里使用的是int数组,int的初始值是0,代表没有落子 。当有皇后放置的时候,对应的元素值改为1 。
在这里,二维数组的第一个维度代表横坐标,第二个维度代表纵坐标,并且从0开始 。比如chessBoard[3][4]代表的是棋盘第四行第五列格子的状态 。
2.如何判断皇后的落点是否合规?
定义一个check方法,传入新皇后的落点,通过纵向和斜向是否存在其他皇后来判断是否合规 。
八字带八绝数组怎么化解 什么是八绝数组

文章插图

3.如何进行递归回溯?
递归回溯是本算法的核心,代码逻辑有些复杂
八字带八绝数组怎么化解 什么是八绝数组

文章插图

4.如何输出结果?
这个问题很简单,直接遍历二维数组并输出就可以 。
八字带八绝数组怎么化解 什么是八绝数组

文章插图

5.如何把这些方法串起来?
在main函数里分三步来调用:
第一步:初始化
第二步:递归摆放皇后
第三步:最后输出结果 。
其中Queen8是整个类的名字 。
八字带八绝数组怎么化解 什么是八绝数组

文章插图

最终输出如下:
10000000
00001000
00000001
00000100
00100000
00000010
01000000
00010000
八字带八绝数组怎么化解 什么是八绝数组

文章插图

八字带八绝数组怎么化解 什么是八绝数组

文章插图

几点补充:
1.由于篇幅原因,这一篇只讲了如何找出第一种正确的八皇后摆放 。大家如果有兴趣,可以对文中的代码稍作改动,实现找出所有八皇后摆放的代码 。
【八字带八绝数组怎么化解 什么是八绝数组】


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。