小鼠迷宮問題

2021-07-10 10:19:50 字數 1594 閱讀 8552

問題描述

小鼠a與小鼠b身處乙個m×n的迷宮中,如圖所示。每乙個方格表示迷宮中的乙個房間。這m×n個房間中有一些房間是封閉的,不允許任何人進入。在迷宮中任何位置均可沿上,下,左,右4個方向進入未封閉的房間。小鼠a位於迷宮的(p,q)方格中,它必須找出一條通向小鼠b所在的(r,s)方格的路。請幫助小鼠a找出所有通向小鼠b的最短道路。

程式設計任務

對於給定的小鼠的迷宮,程式設計計算小鼠a通向小鼠b的所有最短道路。

本題有多組輸入資料,你必須處理到eof為止。

每組資料的第一行有3個正整數n,m,k,分別表示迷宮的行數,列數和封閉的房間數。接下來的k行中,每行2個正整數,表示被封閉的房間所在的行號和列號。最後的2行,每行也有2個正整數,分別表示小鼠a所處的方格(p,q)和小鼠b所處的方格(r,s)。(1≤p,r≤n; 1≤q,s≤m)

對於每組資料,將計算出的小鼠a通向小鼠b的最短路長度和有多少條不同的最短路輸出。每組資料輸出兩行,第一行是最短路長度;第2行是不同的最短路數。每組輸出之間沒有空行。

如果小鼠a無法通向小鼠b則輸出「no solution!」。

8 8 3

3 34 5

6 62 1

7 711

96分析:利用bfs可以計算出最短路徑的距離len(即移動次數),然後用dfs計算出等於len(移動次數)時有多少種不同的最短路徑。

#include#includeusing namespace std;

struct note

;struct note que[2051];

int i,j,k,h,n,m,startx,starty,p,q,ty,tx,flag,ans=0,count=0,an,bn;

int a[51][51],book[51][51],book2[51][51];

int next[4][2]=,,,

};int bfs()

//如果到了目的地,停止擴充套件,任務結束,退出迴圈

if(tx==p&&ty==q)

return que[tail-1].s;

} head++;

} //列印佇列中末尾最後乙個點的步數

//注意tail是指向隊尾的下乙個位置,所以需要-1

} void dfs(int x,int y,int step)//dfs的作用是用來處理當前這一步怎麼走

if(step>ans)

return ;

//未到達位置向四個方向走

for(k=0;k<=3;k++)

} }

int main()

cin>>startx>>starty;

cin>>p>>q;

ans=bfs();//求得最少步數 ,呼叫bfs後book陣列的標記不是初始化為0了,對dfs的影響很大,故應在呼叫bfs之前將book恢復初始化

cout<

book2[startx][starty]=1;//標記起點防止重複走

dfs(startx,starty,0);

cout<

return 0;

}

Foj 1205 小鼠迷宮問題

問題描述 小鼠a與小鼠b身處乙個m n的迷宮中,如圖所示。每乙個方格表示迷宮中的乙個房間。這m n個房間中有一些房間是封閉的,不允許任何人進入。在迷宮中任何位置均可沿上,下,左,右4個方向進入未封閉的房間。小鼠a位於迷宮的 p,q 方格中,它必須找出一條通向小鼠b所在的 r,s 方格的路。請幫助小鼠...

小鼠迷宮問題uva1157

小鼠a與小鼠b身處乙個m n的迷宮中,如圖所示。每乙個方格表示迷宮中的乙個房間。這m n個房間中有一些房間是封閉的,不允許任何人進入。在迷宮中任何位置均可沿上,下,左,右4個方向進入未封閉的房間。小鼠a位於迷宮的 p,q 方格中,它必須找出一條通向小鼠b所在的 r,s 方格的路。請幫助小鼠a找出所有...

SDUT1157 小鼠迷宮問題 bfs dfs

小鼠a與小鼠b身處乙個m n的迷宮中,如圖所示。每乙個方格表示迷宮中的乙個房間。這m n個房間中有一些房間是封閉的,不允許任何人進入。在迷宮中任何位置均可沿上,下,左,右4個方向進入未封閉的房間。小鼠a位於迷宮的 p,q 方格中,它必須找出一條通向小鼠b所在的 r,s 方格的路。請幫助小鼠a找出所有...