HDU 1180 詭異的樓梯(BFS)

2021-08-17 02:13:46 字數 1550 閱讀 9073

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….地圖如下:

總體來說還是一道簡單的bfs題目,由於地圖中加入了變化的樓梯這個因素,所以碰到樓梯的時候需要考慮當前樓梯的方向。一開始寫的時候通過樓梯的方向和當前前進的方向來判斷是否可以通過,然後wa到暴風哭泣(我可能是個傻子吧……),然後才意識到應該通過當前步數的奇偶性去判斷當前樓梯的方向以及是否可以通行。

#include

#include

using namespace std;

int dx[4] = ;

int dy[4] = ;

int visited[21][21];

char map[21][21];

intm, n, sx, sy;

struct node ;

bool ispass(int

x, int

y) void bfs()

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

else

continue;

}else

if(map[next.x][next.y] == '-')

else

continue;

}visited[next.x][next.y] = 1;

q.push(next);}}

}}int main()

}bfs();

}return

0;}

最近寫bfs求最短路徑的題目發現有乙個需要注意的問題,就是有時候需要考慮目標點是否可達,涉及傳送的問題還需要處理發生無限傳送的問題,否則可能會死迴圈然後tle找不到bug……(捂臉)

hdu 1180 詭異的樓梯(bfs)

小記 阿西吧!我就因為乙個dir方向搞錯了,寫的是從左往右是上下左右,用的時候是按上左下右。思路 bfs,首先我們假設沒有樓梯的情況,那麼問題就簡單很多了,bfs隨手可以打出來。打完後再繼續 我們現在要新增可變的樓梯上去。樓梯有個初始狀態,然後有個到達樓梯旁邊時的樓梯的狀態,而這個狀態時和你到達樓梯...

hdu1180詭異的樓梯(bfs)

這道題的意思是哈利波特要從s走到t,中間有那種會改變方向的樓梯,經過樓梯的話一共只用一秒,但是可能會存在有特殊的樓梯會一秒改變一次方向,也就是說可能會等一秒,不會有兩個樓梯連續挨著,還有很重要的一點就是,你不能再樓梯上呆一秒,所以當你找到樓梯的時候,不能把他直接壓進佇列,要直接對它進行處理,然後把處...

HDU1180 詭異的樓梯 BFS

problem description hogwarts正式開學以後,harry發現在hogwarts裡,某些樓梯並不是靜止不動的,相反,他們每隔一分鐘就變動一次方向.比如下面的例子裡,一開始樓梯在豎直方向,一分鐘以後它移動到了水平方向,再過一分鐘它又回到了豎直方向.harry發現對他來說很難找到能...