Sicily 迷宮最短路徑

2021-07-05 15:38:05 字數 2202 閱讀 5233

time limit: 1sec    memory limit:256mb

description

有乙個矩形迷宮,入口和出口都確定為唯一的,且分布在矩形的不同邊上。

現在讓你算出最短需要走多少步,才可以從入口走到出口。

input

共n+1

行,第一行為n(

n=0表示輸入結束),以下n行

n列0-1矩陣,

1表示不能通過

,0表示可以通過

(左上角和右下角為0

,即入口和出口

),其中

n<30。

output

只有乙個數,為最少要走的格仔數。0表示沒有路徑。

sample input

50 1 1 1 1

0 0 1 1 1

1 0 0 0 1

1 1 1 0 1

1 1 1 0 0

40 0 1 1

0 0 0 1

1 1 1 1

1 1 1 0

0

sample output

90這題也是道搜尋題,求最小步數,要用廣度優先搜尋。同時也包含狀態轉換(每到乙個地圖點,不計合法與否,下一步有四個方向可以轉換)。

那麼問題來了,怎樣判重從而減少時間、去除路徑死迴圈呢?像魔板那道題一樣用乙個visit二維陣列標記就可以了。

廣搜就用佇列。如果把這道題想象成一棵以初始狀態為根,以合法狀態轉換為邊,以同時生成的新狀態為子樹的多叉樹,那麼很容易理解廣搜實際上是按層次遍歷節點。如果從根節點開始的路徑p1與p2,有p1短於p2,且兩條路徑都可到達同一地圖點n(設二者對應的最終狀態節點分別為s1和s2),那麼在這顆樹中,s1節點必定會在s2節點之前被遍歷到。

不知道是這玩意兒是只可意會不可言傳,還是我表達能力捉急,反正就這樣~

以下是**和注釋:

#include#include#define max 31

using namespace std;

// 上下左右四個方向

int dirx = ;

int diry = ;

// 路徑節點

struct node

node(int _x, int _y, int _s) : x(_x), y(_y), step(_s) {}

};void bfssearch(queue& q, bool map[max], bool visit[max], int n, bool& isok)

// 上下左右四個方向

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

} }}int main()

} queueq;

// 根節點先入隊

q.push(node(0, 0, 1));

bool isok = false;

bfssearch(q, map, visit, n, isok);

if (!isok)

cout << "0\n";

cin >> n;

} return 0;

}/* test cases

50 1 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 1 1 0

0 0 0 1 0

---9

50 1 0 0 0

0 1 0 1 0

0 0 1 0 0

0 1 1 1 0

0 0 0 1 0

---0

50 1 0 0 0

0 1 0 1 0

0 1 1 0 0

0 0 0 1 0

0 0 0 1 0

---0

50 1 0 0 0

0 1 0 1 0

0 1 0 1 0

0 1 0 1 0

0 0 0 1 0

---17

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 ...

迷宮最短路徑

問題描述 小a同學現在被困在了乙個迷宮裡面,他很想從迷宮中走出來,他可以向上 向下 向左 向右移動 每移動一格都需要花費1秒的時間,不能夠走到邊界之外。假設小a現在的位置在s,迷宮的出口在e,迷宮可能有多個出口。問小a想要走到迷宮出口最少需要花費多少秒?並輸出從起點到最近出口的路徑。任務要求 1 迷...

迷宮的最短路徑

雖然在網上找不到題目,但這題實在是太經典了,好多搜尋題目都是從它變形來的 從s走到g,不能走 測試資料 10 10 s g include include includeusing namespace std const int inf 100000000 define max n 105 defi...