|
发表于 2018-11-17 04:06:20
|
显示全部楼层
本帖最后由 VeryHannibal 于 2021-6-9 23:13 编辑
这个算法我用python实现了一下,发先在判断是否危险的那个函数里 只需要验证左上角,右上角和整个一列就可以,没必要验证左下角和右下角。因为,我们是一行一行去放置皇后的,比如当我们放到第4行的时候 后面4行还没有放置,所以没必要验证。以下为python版的代码:
#八皇后问题:
from copy import deepcopy
class N_Queens():
def __init__(self, n):
self.count = 0
self.size = n
self.chess = [[0 for i in range(n)] for j in range (n)]
self.solutions = []
def judge(self, row, col, chess):
flag1=0
flag2=0
flag3=0
#flag4=0
#flag5=0
#判断一整列
for i in range(self.size):
if chess[i][col] != 0:
flag1 = 1
break
#判断左上方
i = row
j = col
while i>=0 and j>=0:
if chess[i][j] != 0:
flag2 = 1
break
i -= 1
j -= 1
#判断右上方
i = row
j = col
while i>=0 and j<self.size:
if chess[i][j] != 0:
flag3 = 1
break
i -= 1
j += 1
if (flag1 or flag2 or flag3):# or flag4 or flag5):
return False
else:
return True
def nqueen(self, row, chess):
chess_n = deepcopy(chess)
if row == self.size:
print('第%d种结果:'%(self.count+1))
for i in range(self.size):
print(chess_n[i])
print('\n')
self.solutions.append(chess_n)
self.count+=1
else:
for j in range(self.size):
if self.judge(row, j, chess):
for i in range(self.size):
chess_n[row][i]=0
chess_n[row][j]=1
self.nqueen(row+1, chess_n)
else:
pass
nq = N_Queens(8)
nq.nqueen(0, nq.chess)
|
|