知道同学
发表于 2020-3-17 21:54:43
排列组合确实慢
Jensona
发表于 2020-3-28 16:42:58
牛逼嗷
你在说些什么
发表于 2020-4-2 17:15:23
学习学习
为之奈何
发表于 2020-5-7 07:47:53
想知道
java2python
发表于 2020-6-2 03:00:14
学习
java2python
发表于 2020-6-2 13:21:06
本帖最后由 java2python 于 2020-6-3 01:16 编辑
达人的代码太精简了,里面的yield就不懂,用了他的conflict函数,写了一个非递归的:
def conflict(cur_row, row_ptr):
for i in range(cur_row):
if abs(row_ptr - row_ptr) in (0, cur_row - i):
return True
return False
def solve(QUEEN_SUM):
row_ptr = *QUEEN_SUM
cur_row = 0
while(True) :
while(row_ptr == QUEEN_SUM or conflict(cur_row,row_ptr)):
if(row_ptr == QUEEN_SUM):
cur_row -= 1
if(cur_row < 0 ):
return
row_ptr += 1
if(cur_row ==QUEEN_SUM-1) :
chest = [*QUEEN_SUM for i in range(QUEEN_SUM)]
for i in range(QUEEN_SUM):
chest] = 1
print (chest)
print ()
row_ptr += 1
else:
cur_row += 1
row_ptr = 0
solve(8)
yield看了网上的知识,还是半懂不懂,有点超出理解范围,做了一个没有yield的版本,对比代码,总算大致知道意思,yield是同一层的结果扔到turple后再return:
def conflict(state, nextX):
nextY = len(state)
for i in range(nextY):
if abs(state - nextX) in (0, nextY - i):
return True
return False
def queens(num = 3, state = (),cfloor=0):
res = None #这里要res要初始化
for pos in range(num):
if not conflict(state, pos):
#if len(state) == num - 1:
# yield (pos,)
if len(state) == num - 1:
return ((pos,),)
else:
#for result in queens(num, state + (pos,)):
# yield (pos,) + result
result = queens(num, state + (pos,),cfloor+1)
if result == None: #这里要None判别
continue
for ren in result:
if res == None: #这里要None判别
res = (((pos,) + ren),)
else:
res =(((pos,) + ren),) + res
return res
c = 0
result = queens(6,(),0)
for res in result:
c+=1
print ('Solution %d: ' % c)
chest = [*len(res) for i in range(len(res))]
for i in range(len(res)):
chest] = 1
print (chest)
print ()
java2python
发表于 2020-6-2 14:03:08
本帖最后由 java2python 于 2020-6-2 14:51 编辑
八皇后全排列做法(一共是16777216组合,如果找到第一个布局就跳出,就10秒,全部的话3分多钟):
pows =
def check(rows):
for row in range(1,8):
for i in range(row):
if abs(rows - rows) in (0, row - i):
return True
return False
rows = *8
for sts in range(0,pow(8,8)):
for bit in range(0,8):
rows=(sts%pows)//pows
if check(rows) == False:
chest = [*8 for i in range(8)]
for i in range(8):
chest] = 1
print (chest)
print ()
#break
当然全排列太慢了,不过可以稍作改进,就和快速搜索是一样速度了(当然每一位用pows取余数再除,会多一点时间,不过没有数量级的区别),就是检测局面的时候,哪一行出问题(check函数返回true,false改为行号,如果是0,就是原来的false),那么就直接进入这一行的下一个选项(这一行已经出问题,后面的排列搜索全是无用功,实际逻辑和快速搜索一样,不过全排列的程序是最容易理解的):
pows =
def check(rows):
for row in range(1,8):
for i in range(row):
if abs(rows - rows) in (0, row - i):
return row
return 0
rows = *8
sts = 0
while sts < pow(8,8):
for bit in range(0,8):
rows=(sts%pows)//pows
err_row = check(rows)
if err_row == 0:
chest = [*8 for i in range(8)]
for i in range(8):
chest] = 1
print (chest)
print ()
sts += 1
else:
sts += pows
口木呆
发表于 2020-11-23 20:21:18
那份开始开始疯狂
zjc999
发表于 2020-12-1 20:58:07
{:5_109:}
随宇
发表于 2021-3-28 11:00:18
嗷嗷嗷
罗密欧与梁山伯
发表于 2021-4-4 18:45:54
谢谢
2002122
发表于 2021-5-2 00:11:40
要看
Minecraft程序猿
发表于 2021-5-4 13:50:49
{:10_256:}
3255536441
发表于 2021-12-4 17:19:09
666
sjh110
发表于 2021-12-7 23:30:17
666
DefSw0rd
发表于 2024-7-6 10:23:46
布耶特呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃
山有扶苏|溪潺
发表于 2024-7-15 16:08:14
1