【問題描述】:小a同學現在被困在了乙個迷宮裡面,他很想從迷宮中走出來,他可以向上、向下、向左、向右移動、每移動一格都需要花費1秒的時間,不能夠走到邊界之外。假設小a現在的位置在s,迷宮的出口在e,迷宮可能有多個出口。問小a想要走到迷宮出口最少需要花費多少秒?並輸出從起點到最近出口的路徑。
【任務要求】
1、 迷宮用二維字元陣列來表示
2、 選擇一種查詢演算法求出在迷宮中出發的起始位置
3、 佇列儲存從起點到最近出口的路徑
【測試資料】
輸入至少包含3組測試資料。其中1組的測試資料如下:
第一行輸入兩個正整數h (0 < h <= 100)和w (0 < w <= 100),分別表示迷宮的高和寬。
接下來h行,每行w個字元(其中『*』表示路,『#』表示牆,『s』表示小a 的位置,『e』表示迷宮出口)。
當h與w都等於0時程式結束。
輸出輸出小a走到迷宮出口最短路徑,和需要花費的最少時間(秒),如果永遠無法走到出口則輸出「無通路」 和「-1」秒。
#include
#include
typedef struct
int x;
int y;
int pr;
}map;
typedef struct
map *pm;
int r;
int f;
}queue;
void print(queue q)
printf("\nhjkl\n");
int main()
map strat,p;
queue que,pue;
int h,w,i,j,k;
char maze[102][102];
scanf("%d%d",&h,&w);
que.pm=(map *)malloc(sizeof(map)*h*w);
que.f=que.r=-1;
//輸入地圖和加邊
for(i=1;iscanf("%s",maze[i]+1);
for(i=0;imaze[0][i]='#';
maze[h+1][i]='#';
for(i=0;imaze[i][0]='#';
maze[i][w+1]='#';
//找入口
for(i=1;ifor(j=1;jif(maze[i][j]=='s')
strat.x=i;strat.y=j;strat.pr=-1;//定義入口
//將入口入隊
que.pm[++que.f].x=strat.x;
que.pm[que.f].y=strat.y;
que.pm[que.f].pr=-1;
que.r=0;
break;
printf("\n");
//輸出地圖
printf("輸出地圖:\n");
for(i=0;iprintf("%s\n",maze[i]);
p.x=strat.x;
p.y=strat.y;
int cnt=0,pr=que.r;
while(1)
if(maze[p.x+1][p.y] == 'e' ||maze[p.x-1][p.y] == 'e' ||maze[p.x][p.y+1]== 'e' ||maze[p.x][p.y-1] == 'e')
que.pm[que.f+1].pr=pr;
que.pm[++que.f].x=p.x+1;
que.pm[que.f].y=p.y;
break;
if(maze[p.x][p.y+1]=='*')//下
que.pm[que.f+1].pr=pr;
que.pm[++que.f].x=p.x;
que.pm[que.f].y=p.y+1;
maze[p.x][p.y+1]='@';
if(maze[p.x+1][p.y]=='*')//右
que.pm[que.f+1].pr=pr;
que.pm[++que.f].x=p.x+1;
que.pm[que.f].y=p.y;
maze[p.x+1][p.y]='@';
if(maze[p.x-1][p.y]=='*')//左
que.pm[que.f+1].pr=pr;
que.pm[++que.f].x=p.x-1;
que.pm[que.f].y=p.y;
maze[p.x-1][p.y]='@';
if(maze[p.x][p.y-1]=='*')//上
que.pm[que.f+1].pr=pr;
que.pm[++que.f].x=p.x;
que.pm[que.f].y=p.y-1;
maze[p.x][p.y-1]='@';
p.x=que.pm[++que.r].x;
p.y=que.pm[que.r].y;
pr=que.r;
pue.pm=(map *)malloc(sizeof(map)*que.f);
//輸出路徑
i=0;
while(que.pm[pr].pr != -1)
pue.pm[i].x=que.pm[pr].x;
pue.pm[i].y=que.pm[pr].y;
pue.pm[i++].pr=que.pm[pr].pr;
pr = que.pm[pr].pr;
int m=i-1;
//輸出路徑
printf("\n輸出路徑:\n<%d,%d>",strat.x,strat.y);
for(i=m;i>=0;i--)
printf("-><%d,%d>",pue.pm[i].x,pue.pm[i].y);
printf("\n最小步數%d\n",m+2);
return 0;
迷宮最短路徑
include include using namespace std const int max n 100,max m 100 const int inf 100000000 使用pair表示狀態時,使用typedef會更加方便一些 typedef pairp 輸入 char maze max ...
迷宮的最短路徑
雖然在網上找不到題目,但這題實在是太經典了,好多搜尋題目都是從它變形來的 從s走到g,不能走 測試資料 10 10 s g include include includeusing namespace std const int inf 100000000 define max n 105 defi...
Sicily 迷宮最短路徑
time limit 1sec memory limit 256mb description 有乙個矩形迷宮,入口和出口都確定為唯一的,且分布在矩形的不同邊上。現在讓你算出最短需要走多少步,才可以從入口走到出口。input 共n 1 行,第一行為n n 0表示輸入結束 以下n行 n列0 1矩陣,1表...