本帖最后由 java2python 于 2020-6-2 14:51 编辑
八皇后全排列做法(一共是16777216组合,如果找到第一个布局就跳出,就10秒,全部的话3分多钟):pows = [pow(8,0),pow(8,1),pow(8,2),pow(8,3),pow(8,4),pow(8,5),pow(8,6),pow(8,7),pow(8,8)]
def check(rows):
for row in range(1,8):
for i in range(row):
if abs(rows[i] - rows[row]) in (0, row - i):
return True
return False
rows = [0]*8
for sts in range(0,pow(8,8)):
for bit in range(0,8):
rows[bit]=(sts%pows[bit+1])//pows[bit]
if check(rows) == False:
chest = [[0]*8 for i in range(8)]
for i in range(8):
chest[i][rows[i]] = 1
print (chest[i])
print ()
#break
当然全排列太慢了,不过可以稍作改进,就和快速搜索是一样速度了(当然每一位用pows取余数再除,会多一点时间,不过没有数量级的区别),就是检测局面的时候,哪一行出问题(check函数返回true,false改为行号,如果是0,就是原来的false),那么就直接进入这一行的下一个选项(这一行已经出问题,后面的排列搜索全是无用功,实际逻辑和快速搜索一样,不过全排列的程序是最容易理解的):pows = [pow(8,8),pow(8,7),pow(8,6),pow(8,5),pow(8,4),pow(8,3),pow(8,2),pow(8,1),pow(8,0)]
def check(rows):
for row in range(1,8):
for i in range(row):
if abs(rows[i] - rows[row]) in (0, row - i):
return row
return 0
rows = [0]*8
sts = 0
while sts < pow(8,8):
for bit in range(0,8):
rows[bit]=(sts%pows[bit])//pows[bit+1]
err_row = check(rows)
if err_row == 0:
chest = [[0]*8 for i in range(8)]
for i in range(8):
chest[i][rows[i]] = 1
print (chest[i])
print ()
sts += 1
else:
sts += pows[err_row+1]
|