bfs 優先佇列 詭異的梯子 hdu1277

2021-08-22 04:28:44 字數 1535 閱讀 1803

hogwarts正式開學以後,harry發現在hogwarts裡,某些樓梯並不是靜止不動的,相反,他們每隔一分鐘就變動一次方向. 

比如下面的例子裡,一開始樓梯在豎直方向,一分鐘以後它移動到了水平方向,再過一分鐘它又回到了豎直方向.harry發現對他來說很難找到能使得他最快到達目的地的路線,這時ron(harry最好的朋友)告訴harry正好有乙個魔法道具可以幫助他尋找這樣的路線,而那個魔法道具上的咒語,正是由你纂寫的. 

input

測試資料有多組,每組的表述如下: 

第一行有兩個數,m和n,接下來是乙個m行n列的地圖,'*'表示障礙物,'.'表示走廊,'|'或者'-'表示乙個樓梯,並且標明了它在一開始時所處的位置:'|'表示的樓梯在最開始是豎直方向,'-'表示的樓梯在一開始是水平方向.地圖中還有乙個's'是起點,'t'是目標,0<=m,n<=20,地圖中不會出現兩個相連的梯子.harry每秒只能停留在'.'或's'和't'所標記的格仔內. 

output

只有一行,包含乙個數t,表示到達目標的最短時間. 

注意:harry只能每次走到相鄰的格仔而不能斜走,每移動一次恰好為一分鐘,並且harry登上樓梯並經過樓梯到達對面的整個過程只需要一分鐘,harry從來不在樓梯上停留.並且每次樓梯都恰好在harry移動完畢以後才改變方向. 

sample input

5 5

**..t

**.*.

..|..

.*.*.

s....

sample output

7
這個樓梯確實很詭異,首先看一組資料

這組樣例對的答案是2,就是說當你走的方向與樓梯的方向對不上時,這時實際上要停下來等下一秒,這才是到達對面最快的路徑;所以vis標記就是先到哪就標記,後到的一定走重或者是慢的走法。

走的順序是,先到乙個點,判斷是不是梯子,是梯子沿這個方向再向前走一步,是點直接常規操作。

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int maxn=2e6+5;

const int mod=10007;

bool vis[105][105];

struct node

};int dx[5]=;

int dy[5]=;

char a[105][105];

int n,m;

int sx,sy,tx,ty;

inline bool check(int x,int y)

void bfs()

}else if(a[xx][yy]=='|'&&(f.st&1)||(a[xx][yy]=='-'&&f.st%2==0))//橫梯子}}

}}

}}int main()

else if(a[i][j]=='t')

}bfs();

}}

hdu詭異的樓梯 BFS 優先佇列)

這題交了7次 悲劇了 前幾次 因為把 行想成是左右走了 一直wa 後來看出來了 又把走過的樓梯給標記了 這裡的樓梯不能標記 因為可以在原地等著樓梯轉變 加的時間有可能是2 這樣普通佇列滿足不了最少的先搜 就用優先佇列了 view code 1 include2 include 3 typedef s...

HDU1180 詭異的樓梯(bfs 優先佇列)

problem description hogwarts正式開學以後,harry發現在hogwarts裡,某些樓梯並不是靜止不動的,相反,他們每隔一分鐘就變動一次方向.input 測試資料有多組,每組的表述如下 第一行有兩個數,m和n,接下來是乙個m行n列的地圖,表示障礙物,表示走廊,或者 表示乙個...

HDU1180 詭異的樓梯(bfs 優先佇列)

problem description input 測試資料有多組,每組的表述如下 第一行有兩個數,m和n,接下來是乙個m行n列的地圖,表示障礙物,表示走廊,或者 表示乙個樓梯,並且標明了它在一開始時所處的位置 表示的樓梯在最開始是豎直方向,表示的樓梯在一開始是水平方向.地圖中還有乙個 s 是起點,...