我这里写了一个简单的八皇后程序,用的是最笨的算法,大家就不要吐槽我的算法了,问题是我的保存所有解法的总列表不正常,列表中所有元素都一样,劳烦大家看下问题出在哪
import time
import os
def check(list_): #这个函数用来检查当前位置是否合法
for i in range(0,len(list_)-1):
if len(list_)==1 :
continue
for j in range(i+1,len(list_)):
x=list_[i][0]
y=list_[j][0]
x1=list_[i][1]
y1=list_[j][1]
if (x==y or x1==y1 or (x-y)**2==(x1-y1)**2):
return False
return True
def find_position(list_): #这个函数用来寻找下一可尝试位置
if list_ :
if list_[-1][1]==num-1:
list_.pop()
find_position(list_)
else:
return list_
else:
return False
def print_(list_,num): #直观的打印摆法
for i in range(num):
print()
for j in range(num):
if list_[i][1]!=j :
print('十', end='')
else:
print('㊣',end='')
list_=[(0,0)] #初始第一个解法列表
sumlist=[] #所有解法构成的列表
num=8 #皇后数
column=0 #每行开始时尝试的列号
tag=0
if not os.path.isfile(str(num)+'皇后.txt'): #输出到记事本
f=open(str(num)+'皇后.txt','w+')
tag=1
starttime=time.time()
while(len(list_) and len(list_)<num+1): #这里八皇后排到第九行,保证前八行摆的合法
if check(list_):
list_.append((list_[-1][0]+1,column))
else:
find_position(list_)
tuple_ =list_[-1]
list_.pop()
list_.append((tuple_[0],tuple_[1]+1))
list_.pop() #找到一个解
sumlist.append(list_) #去掉第九行
solution=1 #记录总的解法数
print_(list_,num)
if tag==1 :
print(solution,list_,file=f)
while len(list_) : #
list_.pop() #退到第七行
find_position(list_) #找到下一可尝试位置
tuple_ =list_[-1]
list_.pop()
list_.append((tuple_[0],tuple_[1]+1))
while(len(list_) and len(list_)<num+1):
if check(list_):
list_.append((list_[-1][0]+1,column))
else:
find_position(list_)
if list_:
tuple_ =list_[-1]
list_.pop()
list_.append((tuple_[0],tuple_[1]+1))
if list_:
list_.pop()
#print(list_)
sumlist.append(list_)
solution+=1
if tag==1 :
print(solution,list_,file=f)
endtime=time.time()
#print(sumlist[-2],sumlist[-1]) #去掉这里的注释可以发现最后两个元素一样!
if tag==1 :
f.close() #大家可以去文件里查看所有解法确实生成了
print(sumlist) #但sumlist所有元素都是最后一个lsit_的值,也就是空,这里就是我的问题
print(solution) #总的解法数
print((endtime-starttime)/solution) #生成每个解法的平均时间
#0.0089,0.0086,0.0143,0.0244
#92, 352, 724, 2680
这就我的程序,我感觉是我对Python的变量概念理解的不好,希望大神赐教