BFS原理
代码实现
import numpy as np
import random
class BFS:
def __init__(self, row, column, start_node, end_node):
self.row = row
self.column = column
self.start_node = start_node
self.end_node = end_node
self.maze = self.make_01maze()
def make_01maze(self):
maze = np.zeros(shape=(self.row, self.column))
random.seed(5)
for r in range(self.row):
for c in range(self.column):
if (r, c) != (0, 0) and (r, c) != (self.row - 1, self.column - 1):
maze[r, c] = random.randint(0, 1)
print('迷宫:\n', maze)
return maze
def generate_adjacent_graph(self, mr, mc, temp_list, current_node):
row, column = self.maze.shape
if self.maze[mr, mc] == 1:
return []
else:
if mr != 0:
temp_list.append(current_node - column)
if mr != row - 1:
temp_list.append(current_node + column)
if mc != 0:
temp_list.append(current_node - 1)
if mc != column - 1:
temp_list.append(current_node + 1)
return temp_list
def bfs(self):
row, column = self.maze.shape
last_node = np.ones(row * column) * -1
queue = [self.start_node]
while queue:
current_node = queue.pop(0)
mr, mc = int(current_node / column), int(current_node % column)
adjacent_graph = self.generate_adjacent_graph(mr, mc, [], current_node)
for node in adjacent_graph:
if last_node[node] == -1:
queue.append(node)
last_node[node] = current_node
return last_node
def print_path(self, last_node):
if last_node[self.end_node] == -1:
print('节点{} -> 节点{} 是不可达的!')
else:
save_path = [self.end_node]
current_node = self.end_node
while True:
if current_node == self.start_node:
break
save_path.append(int(last_node[current_node]))
current_node = int(last_node[current_node])
print('节点{} -> 节点{} 的最短路径为:'.format(self.start_node, self.end_node))
for node in save_path[::-1]:
if node != self.end_node:
print('node_{}'.format(node), end=' -> ')
else:
print('node_{}'.format(node))
def main():
row, column = 6, 6
bfs = BFS(row, column, start_node=0, end_node=row*column - 1)
last_node = bfs.bfs()
bfs.print_path(last_node)
if __name__ == '__main__':
main()
输出结果
![输出结果](https://img-blog.csdnimg.cn/0a05bb69384b4508a15a022f16e626a4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaHVhbmppbl93,size_20,color_FFFFFF,t_70,g_se,x_16)