N皇后问题

N皇后问题

  1. 问题背景
    首先介绍一下八皇后问题。八皇后是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。计算机发明后,有多种计算机语言可以解决此问题。
    在这里插入图片描述
    N皇后问题是由八皇后演变过来的:在N×N格的国际象棋上摆放N个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。其基本思路与八皇后的解答思路是一样的。
  2. 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行的皇后。同样,如果找到,则继续寻找下面的每一行的皇后。如果仍然没有找到,则继续回溯到上一行,直到完全找不到一个解为止。
  3. java代码实现
final static int size=5;//N皇后
public static int[][] S=new int
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值