n皇后问题---递归法

      问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行,不同列,不同左右对角线。

      解:皇后问题是算法中的经典问题。设f(i,n)表示在n*n方格棋盘 ,已经旋转好第1个,...,第i-1个皇后,现要放置第i个,...,第n个皇后。旋转前i个皇后的解法f(i,n)和旋转前i+1个皇后的解法f(i+1,n)是相似的。

      如何在第k列上找到合适的位置旋转一个皇后呢?假设在第k列上找到合适的位置(i,k)旋转一个皇后,要求它与第1到k-1列上的皇后不同行、不同列、不同左右对角线。

      1、显然不同列成立!因为前k-1个皇后分别放在第1到k-1列上,而该皇后放在第k列上;

      2、对于第j(1<=j<=k-1)个皇后,其位置为(q[j],j),要求与(i,k)位置的皇后不同行的条件为i!=q[j];

      3、如果设全棋盘的方格作为二维数组A[1..n,1..n]的下标那样标记,可以看到,对于在同一条对角线上的由左上方到右下方的每个元素有相同的“行-列”值。同样,在同一条对角线上的由右上方到左下方的每个元素则有相同的“行+列”的值。这样,假设有两个皇后放置在(i,k)和(q[j],j)的位置上,那么根据上述原理,仅当:i-k=q[j]-j或者i+k=q[j]+j时,它们才在同一对角线上。

 

      对应的递归算法如下:

 

      递归法求解皇后问题的优点是容易想到,不难理解, 但是缺点也相当明显,耗时极多。一点也不优化。可用位运算和广度搜索算法进行优化。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值