迷宮最短路徑

2021-08-21 09:17:36 字數 2920 閱讀 1734

【問題描述】:小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表...