hdu 1180 詭異的樓梯(bfs)

2021-06-22 23:25:37 字數 3053 閱讀 3298

小記:阿西吧!我就因為乙個dir方向搞錯了,寫的是從左往右是上下左右,用的時候是按上左下右。。。

思路:bfs,首先我們假設沒有樓梯的情況,那麼問題就簡單很多了,bfs隨手可以打出來。打完後再繼續

我們現在要新增可變的樓梯上去。

樓梯有個初始狀態,然後有個到達樓梯旁邊時的樓梯的狀態,而這個狀態時和你到達樓梯旁邊的步數有關的,奇數步就是和初始狀態相反的狀態,反正相同

現在考慮第一種情況:

我們出現在樓梯的旁邊,那麼此時樓梯是否能讓我們過去(根據到此的步數做決斷)。不能讓就不過去,改下乙個方向繼續判斷。直到處理完所有方向。可以到達的就入隊。

並且我們要對每個點儲存下到這點最少的步數,用以減少不必要的操作。然後比較步數得到最少的。

最開始,我也以為這就是答案了,而且不超過一刻鐘,我提交了**,標準的wa。我預設。開始思考ing

我看到題目描述只有'.', 's','t'可以停,停! 這乙個字點醒了我,我在樓梯旁我是可以停的。!!

這點很關鍵。還好我想到了。於是我改。

我在方向後面加了乙個停,[0,0]表示。在入隊的時候還要加判斷,不然會無限迴圈的。

我採用身邊有'-',或者'|'來做標記要不要等一分鐘。然後還加了乙個記錄,我在這樓梯旁的這個位置,我只停一次!

對只停一次。

我把自己的測試資料試了。

8 2.t

.s答案是7沒錯,果斷提交,自信心滿滿的。

回頭一看,wa。。。 我***的黯然神傷了。這尼瑪還有哪點沒考慮到的。

實在是想不通了,點了點discuss,裡面有測試資料,我拿來測了下,

3 4

s|.|

-t-.

.|..

我的程式跑出來的是6,尼瑪真的是6啊,明明是7啊。6是怎麼來的。。。。

我頓時覺得我可以在這裡找到我的bug。我也順便測了另一組資料

20 20

s.|.|.|.|.|.|.|.|.|.

.|.|.|.|.|.|.|.|.|.|

|.|.|.|.|.|.|.|.|.|.

.|.|.|.|.|.|.|.|.|.|

|.|.|.|.|.|.|.|.|.|.

.|.|.|.|.|.|.|.|.|.|

|.|.|.|.|.|.|.|.|.|.

.|.|.|.|.|.|.|.|.|.|

|.|.|.|.|.|.|.|.|.|.

.|.|.|.|.|.|.|.|.|.|

|.|.|.|.|.|.|.|.|.|.

.|.|.|.|.|.|.|.|.|.|

|.|.|.|.|.|.|.|.|.|.

.|.|.|.|.|.|.|.|.|.|

|.|.|.|.|.|.|.|.|.|.

.|.|.|.|.|.|.|.|.|.|

|.|.|.|.|.|.|.|.|.|.

.|.|.|.|.|.|.|.|.|.|

|.|.|.|.|.|.|.|.|.|.

.|.|.|.|.|.|.|.|.|.t

我的程式是37,答案是20,那些ac的測試的。

我頓時覺得,我的程式怎麼是千倉百孔的。。。飆淚中。。。

開始從6是怎麼出來的著手。

我一直自以為,以為方向陣列是對的, 然後各種printf,終於讓我知道了,我的dir搞錯了。修改一下,

我上左下右的,int dir[5][2] = ,,,,};

這樣我迴圈的時候就是從0-5的,而0,2表示豎,1,3表示橫,因此我只要對迴圈的i對2取模就可以知道是橫還是豎了,0表示豎,1表示橫

這樣的目的是,在碰到樓梯時,假設它開始是豎,用0表示,step步後,到達了該樓梯旁邊,那麼此時該樓梯的狀態就是 step&1, 然後看狀態的結果和i%2是否相等

相等就是代表這樓梯我可以做。

如果是橫,那麼step後,狀態為(1&step)^1. 再與i%2比較。相等亦是同上。

然後提交,ac啦!!!!!!!!!!!!!!!

**:

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define mst(a,b) memset(a,b,sizeof(a))

#define rep(a,b,c) for(int a = b; a < c; ++a)

#define eps 10e-8

const int max_ = 60;

const int n = 100010;

const int inf = 0x7fffffff;

struct point p2, p1;

int dir[5][2] = ,,,,};

int vis[max_][max_];

int a[max_][max_], num[max_][max_];

int n, m, k, ti;

char str[max_][max_];

int bfs(point x)

//printf("%d %d %d\n", cur.x, cur.y, cur.step);

rep(i, 0, 5)

else continue;

}else if(str[nt.x][nt.y] == '-')

else continue;

}if((nt.x > -1 && nt.x < n) &&

(nt.y > -1 && nt.y < m) &&

str[nt.x][nt.y] != '*')

if(i == 4 && flag && !num[nt.x][nt.y])}}

}}

return ans;

}int main()else if(str[i][j] == 't')}}

int ans;

ans = bfs(p1);

printf("%d\n",ans);

} return 0;}/*

8 2.t

...-

...-

...-

.s*/

hdu1180詭異的樓梯(bfs)

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

HDU1180 詭異的樓梯 BFS

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

HDU 1180 詭異的樓梯(BFS)

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