詭異的樓梯 HDU 1180

2021-10-04 08:48:32 字數 1691 閱讀 5022

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是容易想到的,這個題目的難點在於怎麼處理變化的梯子,只要解決了這一點,剩下的就是標準的bfs求解了。因為梯子一分鐘變化一次,而我們走一步也恰好是一分鐘,因此我們可以通過時間的奇偶性來判斷當前梯子的狀態。當我們走到梯子是可以通過,我們就直接通過,如果梯子方向和我們前進的方向不同,我們可以停下來等一分鐘再通過。

#include

#define mem(arr,p) memset(arr,p,sizeof(arr))

using

namespace std;

const

int maxn=21;

int m,n;

int dict[4]

[2]=

;char _map[maxn]

[maxn]

;bool vis[maxn]

[maxn]

;struct node

;node s;

bool

operator

<

(const node &p,

const node &q)

bool

judge

(int x,

int y)

intbfs()

else

}else

if(_map[q.x]

[q.y]

=='-'&&!

(p.t&1)

)}else

// 梯子與行動方向不一致時停下來等一分鐘

}else

// 上下移動時

}else

if(_map[q.x]

[q.y]

=='-'

&&p.t&1)

}else}}

}}return-1

;}intmain()

} cout<<

bfs(

)

**..t

**.*.

..|..

.*.*.

s....

*/

HDU 1180 詭異的樓梯

題意 題意應該很好理解,就是從s到t的最少步數,只是加了乙個樓梯。思路 一看就是廣搜,找最少的步數,harry只能每次走到相鄰的格仔而不能斜走,每移動一次恰好為一分鐘,並且harry登上樓梯並經過樓梯到達對面的整個過程只需要一分鐘,harry從來不在樓梯上停留.並且每次樓梯都恰好在harry移動完畢...

HDU 1180 詭異的樓梯

bfs問題。題意是說爬樓梯的時候,有些樓梯是 有些是 而且每隔一分鐘就互相變化形態。只能上下,只能左右。爬樓梯的過程中,會變的樓梯不能停留,其他的可以停留。爬樓梯需要乙個單位時間,假如是 表明乙個單位時間從它左邊到它右邊或者 右邊到左邊。樓梯停留多次沒有意義,特殊樓梯只有2種旋轉狀態,多乙個wait...

hdu 1180 詭異的樓梯

要注意,雖然樓梯有時不能過,但是我們可以在樓梯前等一下,等到樓梯達到我們需要的狀態時再過,其實不用優先佇列也是可以的.具體自己去想吧.好久沒寫這麼長的 了 include include includeint m,n int tx,ty,sx,sy int visit 21 21 int dir 4...