回溯法——n后问题

题目:在一个N*N的棋盘中,放置n个皇后,要求同一行、同一列、同一对角线上不能存在两个皇后,求放置皇后的策略。

思路:将棋盘压缩存储为一维数组ar[N],数组中第i个元素就是棋盘第i行的皇后位置。这样就不存在行冲突的问题,至于列冲突,判断当前ar数组中是否存在与将要放置皇后的j列下标相等的数,即可,若存在,则该位置不可放置皇后,j++;若不存在,则该位置可以防止皇后,对于对角线冲突,从棋盘左上角到右下角的主对角线及其平行线(即斜率为-1的各斜线),2个下标值的差值(行号-列号)相等;同理斜率为+1的斜线上,2个下标值的和(行号+列号)相等;因此若两个皇后放置的位置分别是(i,j)和(k,L),且i-j=k-L或i+j=k+L,则说明这两个皇后处于同一斜线上。以上两个方程分别等价于i-k=j-L和i-k=L-j,由此可知只要|i-k|=|j-L|成立,就表明两个皇后位于同一条斜线上。即它们所在的行列互减的绝对值相等,即| row – i | = | col – a[i] | 。这样某个位置是否可以放置皇后的问题已经解决。

对于该问题,我们可以通过递归和非递归两种方法实现,但递归效率不高,下面着重考虑非递归方法。

非递归方法的一个重要问题是何时回溯及如何回溯的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值