shufenbuguadi 2015-02-06 12:29 采纳率: 0%
浏览 1037

python 八皇后中的列表问题

我这里写了一个简单的八皇后程序,用的是最笨的算法,大家就不要吐槽我的算法了,问题是我的保存所有解法的总列表不正常,列表中所有元素都一样,劳烦大家看下问题出在哪

 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的变量概念理解的不好,希望大神赐教

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-09 18:29
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试