#八皇后问题(没有用递归的操作,直接判断)
import itertools as it
n = 4
blank = n * n
chest = [[0]*n for i in range(n)]
# 创建一个迭代器,返回iterable中所有长度为r的子序列,
#返回的子序列中的项按输入iterable中的顺序排序
comb = it.combinations(list(range(blank)),n)
def check(x,y): #判断是否安全 ?这里怎么判断的??
if max(chest[x]) == 1: #横的方向已经有了元素了
return False
if max([chest[i][y] for i in range(n)]) == 1:
return False #竖的方向已经有了元素了
for i in range(n):
for j in range(n):
if i+j == x+y or i-j == x-y: #斜线的方向
if chest[i][j] == 1:
return False
return True
queen = 0
c = 0
for each in comb: #遍历每一种情况
for e in each: #遍历每一个元素
x = e // n #行
y = e % n #列
if check(x,y): #判断是否安全
chest[x][y] = 1
queen += 1
else:
chest = [[0]*n for i in range(n)] #全部置为0
queen = 0
break
if queen == n: #正好填够n个皇后
c += 1
print ('Solution %d:' % c) #第几种情况
for q in chest: #每一个chest代表一种情况
print (q)
print ('*'*20)
chest = [[0]*n for i in range(n)]
queen = 0
八皇后问题(python)
最新推荐文章于 2024-03-22 21:15:38 发布