八皇后问题(python)

#八皇后问题(没有用递归的操作,直接判断)
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

发布了14 篇原创文章 · 获赞 1 · 访问量 477

猜你喜欢

转载自blog.csdn.net/ironman321/article/details/104166264