走迷宮(佇列 廣搜 傳送門)

2021-10-05 00:02:13 字數 2378 閱讀 7230

時間限制:1000ms **長度限制:10kb

提交次數:0 通過次數:0

題型: 程式設計題 語言: g++;gcc;vc

description

有乙個n*m的格仔迷宮,1代表該格仔為牆,不能通過,0代表可以通過,另外,在迷宮中

有一些傳送門,走到傳送門的入口即會自動被傳送到傳送門的出口(一次傳送算1步)。人在迷宮中可以嘗試

上下左右四個方向移動。現在給定乙個迷宮和所有傳送門的出入口,以及起點和終點,

問最少多少步可以走出迷宮。如果不能走出迷宮輸出「die」。

該程式為多case,第1行為case的數量

每乙個case,第1行為兩個數n(行)和m(列)

然後n行每行斜體樣式m個數

之後是乙個數w,為傳送門的數量

之後每行乙個傳送門的入口座標c1(行),r1(列)和出口座標c2,r2

之後是起點座標和終點座標sc(行) sr(列) ec(行) er(列)

注:傳送門出入口和起點座標和終點座標不會出現在牆的位置

所有數字不超過100

輸入樣例

24 3

011011

110110

11 0 2 2

0 0 3 2

2 201100

0 0 1 1

輸出樣例

3die

作者 admin

///分割線//

這道題跟普通的走迷宮有點不一樣,不一樣的地方在**呢?

在於題目提到***「在迷宮中有一些傳送門,走到傳送門的入口即會自動被傳送到傳送門的出口(一次傳送算1步)」***,這就是不一樣的地方。為了解決傳送門的問題,我們需要先建立乙個結構體儲存每一次的傳送門入口和出口(即入口的座標和出口的座標是放在同乙個節點)

struct doors

;。在迷宮中每次在某個位置進行四個方向探索時,將探索後的座標a與傳送門的入口座標進行對比,判斷是否相等,如果相等的話,那麼就確定了a下一步就只能選擇走向相應傳送門的出口。那麼如何知道某個點是否是傳送門的入口呢?我們只需設立乙個flag即可。如

struct node

;每次探索的時候將探索後的座標與每個傳送門入口的座標進行對比,如果相等,flag就被賦值為傳送門的下標,並且入隊。在後面的出隊過程中,如果發現某個隊元素的flag為非零值,那麼下次探索就只能向相應傳送門出口進行。

解決了傳送門問題,那麼其他的就是極其經典的問題了。

///分割線//

這道題有個測試點很坑的就是走迷宮的起點與終點是相同的,該情況需要進行特判。本人在這點上錯了賊慘,wa幾次之後才猛然想到這種情況。

好了貼**。

#include

#include

using

namespace std;

int dx[4]

=,dy[4]

=;struct node

;struct doors

;int v[

110]

[110];

char a[

110]

[110];

int n,m,door_num;

//行和列以及門的數量

doors door[

110]

;//宣告傳送門

node in,out;

//宣告起點和終點

intbfs

(int x,

int y)

;while

(f!=r)

if(temp.flag!=0)

//從傳送門出來的

; v[door[temp.flag]

.x2]

[door[temp.flag]

.y2]

=v[temp.x]

[temp.y]+1

;}else

//不是從傳送門出來的

for(

int i=

0;i<

4;i++);

_flag=1;

v[cx]

[cy]

=v[temp.x]

[temp.y]+1

;break;}

}if(_flag==

0&&cx>=

0&&cx=

0&&cy[cy]==0

&&a[cx]

[cy]

=='0'

)//非傳送門

; v[cx]

[cy]

=v[temp.x]

[temp.y]+1

;}}}

return0;

}int

main()

}return0;

}

結束/

走迷宮2(邊界跳躍 佇列 廣搜)

先貼題目。time limit 1000ms memory limit 65535k 題型 程式設計題 語言 無限制 描述有乙個n m n,m 10 的格仔迷宮,1代表該格仔為牆,不能通過,0代表可以通過,人在迷宮中可以嘗試上下左右四個方向移動。另外,在迷宮中如果從左邊走出迷宮會回到迷宮最右邊一格 ...

廣搜 快走迷宮

有乙個mn格的迷宮 表示有m行 n列 其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,檔案讀入這mn個資料和起始點 結束點 起始點和結束點都是用兩個資料來描述的,分別表示這個點的行號和列號 現在要你程式設計找出最短的道路,要求所走的路中沒有重複的點,走時只能是上下左右四個方向。如果一條...

迷宮問題 廣搜

定義乙個二維陣列 int maze 5 5 queue 26 int head 0,tail 0,a 5 5 book 5 5 void function int tail 引數是隊尾 else function queue tail f 如果隊尾的父節點不是0 就將該父節點作為新的隊尾繼續呼叫 這...