SDUT1157 小鼠迷宮問題 bfs dfs

2022-02-20 04:07:38 字數 1878 閱讀 5592

小鼠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)。

對於每組資料,將計算出的小鼠a通向小鼠b的最短路長度和有多少條不同的最短路輸出。

每組資料輸出兩行,第一行是最短路長度;第2行是不同的最短路數。

每組輸出之間沒有空行。

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

8 8 3

3 34 5

6 62 1

7 7

11

96

題目大意:在乙個迷宮內輸出位置a到位置b的最短距離,以及一共有多少種不同的最短路徑數。

分析:利用bfs可以計算出最短路徑的距離,然後用dfs計算出等於有多少種不同的最短路徑。

題目解析:

通過做這題,發現對演算法的思想很渣渣,拿到題簡直無法先手,有點弄混bfs與dfs,

bfs可以求最短路,但無法求最短路徑的數目,但dfs 不同,它通過不斷的回溯與查詢,可以

遍歷所有的情況。

#include #include 

#include

#include

#include

using

namespace

std;

char map[101][101

];int v[101][101

];struct

node

;struct

node t,f;

int a[2],b[2

];int fx= ;

int fy= ;

intn,m,k,flag,sum;

void

bfs()

for(int i=0; i<4; i++)}}

printf(

"no solution!\n");

return;}

void dfs(int xx,int yy,int

ans)

if(xx>b[0]||yy>b[1]||ans>=flag) return

;

for(int i=0; i<4; i++)

}}int

main()

scanf(

"%d%d

",&a[0],&a[1

]); scanf(

"%d%d

",&b[0],&b[1

]); bfs();

if(flag==0) continue

; memset(v,

0,sizeof

(v));

v[a[

0]][a[1]]=0

; dfs(a[

0],a[1],0

); printf(

"%d\n

",sum);

}return0;

}

sdut 1157 小鼠迷宮

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

小鼠迷宮問題uva1157

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

小鼠迷宮問題

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