题目:
代码:
from collections import deque f=[[1,1,1,1,1,1,1,1,1,1], [1,0,0,1,0,0,0,1,0,1], [1,0,0,1,0,0,0,1,0,1], [1,0,0,0,0,1,1,0,0,1], [1,0,1,1,1,0,0,0,0,1], [1,0,0,0,1,0,0,0,0,1], [1,0,1,0,0,0,1,0,0,1], [1,0,1,1,1,0,1,1,0,1], [1,1,0,0,0,0,0,0,0,1], [1,1,1,1,1,1,1,1,1,1] ] dirs=[ lambda x,y:(x+1,y), lambda x,y:(x-1,y), lambda x,y:(x,y+1), lambda x,y:(x,y-1) ]
输出函数:
def t_print(ltmp):
node=ltmp[-1]
ltmp_s=[]
while node[2]!=-1:
ltmp_s.append(node[0:2])
node=ltmp[node[2]]
ltmp_s.append(node[0:2])
ltmp_s.reverse()
for i in ltmp_s:
print(i)
主函数:
def queue_keep(x1,y1,x2,y2):
queue=deque()
queue.append((x1,y1,-1))
ltmp=[]
while len(queue)>0:
curnode=queue.pop()
ltmp.append(curnode)
if curnode[0]==x2 and curnode[1]==y2:
t_print(ltmp)
return True
for dir in dirs:
nextnode=dir(curnode[0],curnode[1])
if f[nextnode[0]][nextnode[1]]==0:
queue.append((nextnode[0],nextnode[1],len(ltmp)-1))
f[nextnode[0]][nextnode[1]] = 2
else:
print(0)
return False
queue_keep(1,1,8,8)
bfs的基本模板:
先将节点与之对应关系的联系在一起,原理是一开始将一节点放入队列,抛出同时将相应点放入队列中,接着依路抛出并放入,出来的就是一条bfs路径
temps
=
{
"A"
: [
"B"
,
"C"
],
"B"
: [
"A"
,
"C"
,
"D"
],
"C"
: [
"A"
,
"B"
,
"D"
,
"E"
],
"D"
: [
"B"
,
"C"
,
"E"
,
"F"
],
"E"
: [
"C"
,
"D"
],
"F"
: [
"D"
]
}
def BFS(temps, s):
queue = []
queue.append(s) # 向list添加元素,用append()
seen = set() # 此处为set, python里set用的是hash table, 搜索时比数组要快。
seen.add(s) # 向set添加函数,用add()
while (len(queue) > 0):
vertex = queue.pop(0) #提取队头
nodes = temps[vertex] #获得队头元素的邻接元素
for w in nodes:
if w not in seen:
queue.append(w) #将没有遍历过的子节点入队
seen.add(w) #标记好已遍历
print("当前出队的是:",vertex)
BFS(temps, 'A')