使用Python使用BFS算法解决8难题



我想用bfs算法和使用Python解决8谜题问题 这是我的代码,我不明白我的代码到底有什么问题。但它一直在运行,不会停止,也不会解决问题。


list = [1,2,3,8,0,4,7,6,5]
goal_list=[2,8,1,0,4,3,7,6,5]
for i in list:
if list[i]==0:
x=i
print(x)
count=0
check="false"
list_up=[]
list_down=[]
list_left=[]
list_right=[]
list_copy=[]
queue=[]
save_list=[]

up=x-3
down=x+3
left=x-1
right=x+1
if up>=0:
list_up=list.copy()
list_up[x]=list_up[up]
list_up[up]=0
u=up
up=u-3
count+=1
queue.append(list_up)
save_list.append(list_up)
print (queue)
if list_up==goal_list:
#check=true
print("problem solved with %d tries" %count)
if down<=8:
list_down=list.copy()
list_down[x]=list_down[down]
list_down[down]=0
count+=1
d=down
down=d+3
queue.append(list_down)
save_list.append(list_down)
if list_down==goal_list:
print("problem solved with %d tries" %count)
if left>=0:
list_left=list.copy()
list_left[x]=list_left[left]
list_left[left]=0
count+=1
l=left
left=l-1
queue.append(list_left)
save_list.append(list_left)
if list_left==goal_list:
print("problem solved with %d tries" %count)
if right<=8:
list_right=list.copy()
list_right[x]=list_right[right]
list_right[right]=0
count+=1
r=right
right=r+1
queue.append(list_right)
save_list.append(list_right)
print("in if right")
if list_right==goal_list:
print("problem solved with %d tries" %count)
#print(queue.pop(0))    

def go_up():
global up
global u
global count
global check
global queue
global list_up
global save_list
global goal_list
print("in up def")
for i in list_up:
if list_up[i]==0:
u=i
up=u-3
if up>=0:
list_up[u]=list_up[up]
list_up[up]=0
count+=1
#u=up
#up=u-3
queue.append(list_up)
save_list.append(list_up)
if list_up==goal_list:
check="true"
print("problem solved with %d tries" %count)
print(save_list)

def go_down():
global down
global d
global count
global check
global queue
global list_down
global save_list
global goal_list
for i in list_down:
if list_down[i]==0:
d=i
down=d+3
if down<=8:
print("in down def")
#list_down=list.copy()
list_down[d]=list_down[down]
list_down[down]=0
count+=1
d=down
down=d+3
queue.append(list_down)
save_list.append(list_down)
if list_down==goal_list:
check="true"
print("problem solved with %d tries" %count)
print(save_list)

def go_left():
global left
global l
global count
global check
global queue
global list_left
global save_list
global goal_list
for i in list_left:
if list_left[i]==0:
l=i
left=l-1
if left>=0:
#if l not in[0,3,6] :
if l==1|l==2|l==4|l==5|l==8|r==7:
print("in left def")
#list_left=list.copy()
list_left[l]=list_left[left]
list_left[left]=0
count+=1
l=left
left=l-1
queue.append(list_left)
save_list.append(list_left)
if list_left==goal_list:
check="true"
print("problem solved with %d tries" %count)
print(save_list)

def go_right():
global right
global r
global count
global check
global queue
global list_right
global save_list
global goal_list
for i in list_right:
if list_right[i]==0:
r=i
right=r+1
if right<=8:
#if r not in[2,5,8]:
if r==0|r==1|r==3|r==4|r==6|r==7:
print("in right def")
list_right[r]=list_right[right]
list_right[right]=0
count+=1
r=right
right=r+1
queue.append(list_right)
save_list.append(list_right)
if list_right==goal_list:
check="true"
print("problem solved with %d tries" %count)
print(save_list)

while check=="false":
print("len queue is:")
print(len(queue))
if len(queue)>0:
list_copy=queue.pop(0)
print (len(queue))
list_up=list_copy.copy()
go_up();
if check=="true":
break

list_down=list_copy.copy()
go_down();
if check=="true":
break
list_left=list_copy.copy()
go_left();
if check=="true":
break
list_right=list_copy.copy()
go_right();
if check=="true":
break

print("out of while")
print (save_list)
print ()

我是python的新手,任何帮助将不胜感激

关于我的代码: 列表保存初始状态,goal_list是最终状态。我设置检查变量以检查是否达到最终目标。x,u,d,l,r 在列表中保存索引 0。save_list是到达最终状态的路由(方式(代码。

再次感谢您的帮助

这不是一个完整的答案,但我可以立即发现几个问题。 有这样的陈述:

if r==0|r==1|r==3|r==4|r==6|r==7

它们不像你认为的那样工作。 阅读 Python 中的逻辑运算符链接。 例如,此表达式实际上计算 r==1 的 False。

你对你评论掉的声明更接近:

#if r not in[2,5,8]:

那应该是:

if r not in (2, 5, 8):

in 运算符后必须有一个空格。

不要使用"list"作为变量名,因为它是Python中的内置类,使用它可能会导致细微的错误。 此外,队列也不是变量名的好选择,因为有几个标准库模块使用此名称。

在任何语言中都应谨慎使用全局变量。

最后,我有一个友好的建议:我认为通过输入230行复杂代码来学习一门新语言,然后在它不起作用时举手投降,这不是一个好主意。 你可以用一门新语言编写这么多无错误的代码的机会必须接近于零,就像明天太阳不会升起的机会一样。 从一个小问题开始。

最新更新