題目思路
注意事項
ac**
hogwarts正式開學以後,harry發現在hogwarts裡,某些樓梯並不是靜止不動的,相反,他們每隔一分鐘就變動一次方向.
比如下面的例子裡,一開始樓梯在豎直方向,一分鐘以後它移動到了水平方向,再過一分鐘它又回到了豎直方向.harry發現對他來說很難找到能使得他最快到達目的地的路線,這時ron(harry最好的朋友)告訴harry正好有乙個魔法道具可以幫助他尋找這樣的路線,而那個魔法道具上的咒語,正是由你纂寫的.
測試資料有多組,每組的表述如下:
第一行有兩個數,m和n,接下來是乙個m行n列的地圖,』*『表示障礙物,』.『表示走廊,』|『或者』-『表示乙個樓梯,並且標明了它在一開始時所處的位置:』|『表示的樓梯在最開始是豎直方向,』-'表示的樓梯在一開始是水平方向.地圖中還有乙個』s』是起點,『t』是目標,0<=m,n<=20,地圖中不會出現兩個相連的梯子.harry每秒只能停留在』.'或』s』和』t』所標記的格仔內.
只有一行,包含乙個數t,表示到達目標的最短時間.
注意:harry只能每次走到相鄰的格仔而不能斜走,每移動一次恰好為一分鐘,並且harry登上樓梯並經過樓梯到達對面的整個過程只需要一分鐘,harry從來不在樓梯上停留.並且每次樓梯都恰好在harry移動完畢以後才改變方向.
5 5
**..t
**.*.
..|..
.*.*.
s....
7
樣例地圖如下
一題簡單bfs,但是有乙個小難點在於樓梯怎麼走
題目告知了不會在樓梯上停留
但是事實上你碰到錯誤方向的樓梯,可以在原地停留等樓梯改變方向
搞清楚這一點,寫起來就不難了,但是我沒搞清楚的時候wa了20+發
有很多種判斷方向的方式,我這裡是先記錄每個梯子與時間奇偶性的4種可能
『-』 與 偶數時間 = '|'與奇數時間 = 橫向移動
『-』 與 奇數時間 = '|'與偶數時間 = 豎向移動
把橫向移動標記為1 豎向移動標記為2,看清楚自己寫的移動位置對應的方向,對應著判斷即可
不能在樓梯上停留,方向錯了原地等待
過樓梯之後的地方要重新檢查是否能走
樓梯本身不能被標記走過,因為可能重複利用
用時31ms 記憶體1256k 長度2235b
#include
#include
//memset所需
#include
//佇列
using namespace std;
struct node };
int n,m;
int step[4]
[2]=
,//上
,//下
,//左
,//右};
char grid[30]
[30];
//記錄地圖
int vis[30]
[30];
//記錄是否走過
int jump[
300][2
];//用於記錄梯子狀態
void
init()
intcheck
(int x,
int y)
intbfs()
} vis[now.x]
[now.y]=1
;//起點設定為走過
que.
push
(now)
;while
(!que.
empty()
)else nex = now;
//如果與梯子方向不同,就原地等待
} vis[nex.x]
[nex.y]=1
;//標記此次目的地被走過
nex.step +=1
;//時間增加
que.
push
(nex)
;//入隊}}
return0;
//如果走不到別忘了返回乙個0
}int
main()
return0;
}
hdu 1180 詭異的樓梯(bfs)
小記 阿西吧!我就因為乙個dir方向搞錯了,寫的是從左往右是上下左右,用的時候是按上左下右。思路 bfs,首先我們假設沒有樓梯的情況,那麼問題就簡單很多了,bfs隨手可以打出來。打完後再繼續 我們現在要新增可變的樓梯上去。樓梯有個初始狀態,然後有個到達樓梯旁邊時的樓梯的狀態,而這個狀態時和你到達樓梯...
hdu1180詭異的樓梯(bfs)
這道題的意思是哈利波特要從s走到t,中間有那種會改變方向的樓梯,經過樓梯的話一共只用一秒,但是可能會存在有特殊的樓梯會一秒改變一次方向,也就是說可能會等一秒,不會有兩個樓梯連續挨著,還有很重要的一點就是,你不能再樓梯上呆一秒,所以當你找到樓梯的時候,不能把他直接壓進佇列,要直接對它進行處理,然後把處...
HDU1180 詭異的樓梯 BFS
problem description hogwarts正式開學以後,harry發現在hogwarts裡,某些樓梯並不是靜止不動的,相反,他們每隔一分鐘就變動一次方向.比如下面的例子裡,一開始樓梯在豎直方向,一分鐘以後它移動到了水平方向,再過一分鐘它又回到了豎直方向.harry發現對他來說很難找到能...