巧解八皇后

开阔思路了,从没想过用一维数组代替二维数组解八皇后问题

题目描述

在棋盘上放置8个皇后,使她们互不攻击,此时每个皇后的攻击范围为同行同列和对角线,要求找出所有解。

在这里插入图片描述

思路

1、最简单的思路是把问题转化为“从64个格子中选一个子集”,使得“子集中恰好有8个格子,且任意两个选出的格子都不在同一行、同一列、同一对角线“。然而64个格子有2的64次方个子集,很明显这会导致运行时间过长。

2、稍微会简便一点的想法是”从64个格子中选8个格子“,这就是组合生成的问题,但是依旧有4.426 x 10^9种方案,比第一种好,但还是过于复杂

3、用一个长度为8的一维数组表示8个皇后的位置,比如 [4, 6, 1, 3, 7, 0, 2, 5],这样就变成了0~7的排列问题了,8!=40320个,显然胜于前两种方案,我们可以通过DFS来实现。

代码

#输入有多少个皇后
n=int(input())
end=[]
kinds=0
def con():
    global n,end,kinds
    for i in range(n):
        if len(end)==0:
            end.append(i)
            con()
            del end[-1]
        else:
            if i not in end:
                t=True
                for j in range(len(end)):
                    if i-end[j]==len(end)-j or i-end[j]==j-len(end):
                        t=False
                        break
                if t==True:
                    end.append(i)
                    con()
                    del end[-1]
    if len(end)==n:
        kinds+=1
con()
print(kinds)

编码不易,有帮助的话点个赞支持一下吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值