八皇后的一种非递归解决思路

最近在学Python,书中关于八皇后问题的递归解很巧妙,但我一直在想能否不用递归而是用循环,主要卡在两点,一是如何不用递归而给出任意规格棋盘上落子的所有可能,二是如何验算这些可能。

第一个问题是将整个棋盘上的棋子位置视作n进制下对应位置上的数字

以4*4棋盘为例

当棋子摆放位置为【1,0,0,0】时,可以将其视为一个4进制数“1000”,换算成10进制数就是64

当棋子摆放位置为【1,0,1,0】时,可以将其视为一个4进制数“1010”,换算成10进制数就是68

通过上述过程可以将棋子的每一种摆放可能与从0开始到10进制摆法总数的每一个数绑定。摆法总数易得,通过进制换算就可以还原成棋子位置。比如255通过4进制除法还原成【3,3,3,3】,1通过4进制除法还原成【0,0,0,1】等。

第二个问题用了两个for循环,检测行差和列差的关系,不知道大佬们怎么解决的。。。

def Conflict(list):
    for i in range(len(list)-1):
        start=i+1
        end=len(list)
        for x in range(start,end):# 此函数实现从起始位置(动态的起始位置) 开始向后直到结尾的遍历
            if (x-i)==abs(list[x]-list[i]):#两个元素如果行差=列差,则必错
                return
            else:
                pass
    print(list)
    return list
def Calculate(n):
    counter=0
    List=[]
    while counter<(n**n):
        list=[]
        x=counter
        for i in range(n):
            #将棋盘中每行元素的列位置看做n进制下对应位置上的数字
            t=x%n
            list.append(t)
            x=x//n
        list.reverse()
        set_list = set(list)
        if len(set_list) == len(list):#初步筛选如果有不同行处于一列,则无调用意义
            y=Conflict(list)
            if y:
                List.append(y)
        else:
            pass
        counter+=1
    print(List)
    print(len(List))
Calculate(8)#正确性经过验证
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值