|
发表于 2020-6-2 14:03:08
|
显示全部楼层
本帖最后由 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]
复制代码
|
|