N皇后问题
- 问题背景
首先介绍一下八皇后问题。八皇后是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。计算机发明后,有多种计算机语言可以解决此问题。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fdaeba4518ad1c9488bf120a1359ce80.png)
N皇后问题是由八皇后演变过来的:在N×N格的国际象棋上摆放N个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。其基本思路与八皇后的解答思路是一样的。
- N皇后问题的递归回溯
N*N的棋盘存储在一个二维数组S[N][N]中即可(0表示空,1表示该位置存在皇后)
(1)从第0行开始,选择第一个节点作为作为皇后(代码中设置S中相应位置为1)
(2)开始寻找接下来的皇后,寻找第i行的皇后位置时,如果可以找到,优先选择第一个可以存放皇后的位置,设置S中相应位置为1,该皇后可以放在该位置的要求如下图:
1)左对角线上的左上方的几个位置不存在皇后
2)右对角线上的右上方的几个位置不存在皇后
3)该列正上方的几个位置不存在皇后
只有符合这三个条件,该位置才可以存放皇后
(3)寻找第i行的皇后位置时,如果找不到,便开始回溯。向上一层开始回溯,放弃已经选择的第i-1行的皇后,从该行后续节点中重新选择第i-1行的皇后。同样,如果找到,则继续寻找下面的每一行的皇后。如果仍然没有找到,则继续回溯到上一行,直到完全找不到一个解为止。
![](https://i-blog.csdnimg.cn/blog_migrate/e1a38587545e232a4175916008badccf.png)
- java代码实现
final static int size=5;
public static int[][] S=new int