時間限制: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 就將該父節點作為新的隊尾繼續呼叫 這...