开阔思路了,从没想过用一维数组代替二维数组解八皇后问题
题目描述
在棋盘上放置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)
编码不易,有帮助的话点个赞支持一下吧