題目
解析與代碼
迷宮文件
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% S%
% %%%%%%%%%%%%%%%%%%%%%%% %%%%%%%% %
% %% % % %%%%%%% %% %
% %% % % % % %%%% %%%%%%%%% %% %%%%%
% %% % % % % %% %% %
% %% % % % % % %%%% %%% %%%%%% %
% % % % % % %% %%%%%%%% %
% %% % % %%%%%%%% %% %% %%%%%
% %% % %% %%%%%%%%% %% %
% %%%%%% %%%%%%% %% %%%%%% %
%%%%%% % %%%% %% % %
% %%%%%% %%%%% % %% %% %%%%%
% %%%%%% % %%%%% %% %
% %%%%%% %%%%%%%%%%% %% %% %
%%%%%%%%%% %%%%%% %
%E %%%%%%%%%%%%%%%% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
111111111111111111111111111111111111
1000000000000000000000000000000000S1
101111111111111111111111101111111101
101100010001000000111111100011000001
101101010101011110111111111011011111
101101010101000000000000011011000001
101101010101010111100111000011111101
101001010100010000110111111110000001
101101010111111110110000000011011111
101101000110000000111111111011000001
100001111110111111100000011011111101
111111000000100000001111011010000001
100000011111101111101000011011011111
101111110000001000000011111011000001
100000000111111011111111111011001101
111111111100000000000000000011111101
1E0000000001111111111111111000000001
111111111111111111111111111111111111
解決方案與運行截圖
#解決迷宮問題,使用BFS可以比較高效地找到最短路
f = open('MazeData.txt')
stream = f.read()
Maze = stream.split('\n')[:18]
N = len(Maze);M = len(Maze[0])
Maze = [list(s) for s in Maze]
start = 0;
end = 0;
for i in range(N):
for j in range(M):
if Maze[i][j]=='%':
Maze[i][j] = 1
else:
if Maze[i][j] == 'S':
start = (i,j)
elif Maze[i][j] == 'E':
end = (i,j)
Maze[i][j] = 0
import queue
from copy import deepcopy
q = queue.Queue()
q.put(start)
visited = deepcopy(Maze)
visited[start[0]][start[1]] = 1
d = [(0,1),(0,-1),(1,0),(-1,0)]
source = [[(-1,-1) for _ in range(M)] for _ in range(N)];
source[start[0]][start[1]] = (-1,-1)
while(not q.empty()):
pair = q.get()
if pair==end:break
nexts = [(pair[0]+D[0],pair[1]+D[1]) for D in d
if 0<=pair[0]+D[0]<N and 0<=pair[1]+D[1]<M]
for n in nexts:
if not visited[n[0]][n[1]]:
q.put((n[0],n[1]))
visited[n[0]][n[1]] = 1
source[n[0]][n[1]] = pair
point = end
vec = []
while(source[point[0]][point[1]]!=(-1,-1)):
vec.append(point)
point = source[point[0]][point[1]]
vec.reverse()
for p in vec:
Maze[p[0]][p[1]] = 2
Maze[start[0]][start[1]] = 3
Maze[end[0]][end[1]] = 3
import matplotlib.pyplot as plt
plt.matshow(Maze)