中山大學人工智能實驗1 Maze Problem

題目

在這裏插入圖片描述

解析與代碼

迷宮文件

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                 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)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章