小記:阿西吧!我就因為乙個dir方向搞錯了,寫的是從左往右是上下左右,用的時候是按上左下右。。。
思路:bfs,首先我們假設沒有樓梯的情況,那麼問題就簡單很多了,bfs隨手可以打出來。打完後再繼續
我們現在要新增可變的樓梯上去。
樓梯有個初始狀態,然後有個到達樓梯旁邊時的樓梯的狀態,而這個狀態時和你到達樓梯旁邊的步數有關的,奇數步就是和初始狀態相反的狀態,反正相同
現在考慮第一種情況:
我們出現在樓梯的旁邊,那麼此時樓梯是否能讓我們過去(根據到此的步數做決斷)。不能讓就不過去,改下乙個方向繼續判斷。直到處理完所有方向。可以到達的就入隊。
並且我們要對每個點儲存下到這點最少的步數,用以減少不必要的操作。然後比較步數得到最少的。
最開始,我也以為這就是答案了,而且不超過一刻鐘,我提交了**,標準的wa。我預設。開始思考ing
我看到題目描述只有'.', 's','t'可以停,停! 這乙個字點醒了我,我在樓梯旁我是可以停的。!!
這點很關鍵。還好我想到了。於是我改。
我在方向後面加了乙個停,[0,0]表示。在入隊的時候還要加判斷,不然會無限迴圈的。
我採用身邊有'-',或者'|'來做標記要不要等一分鐘。然後還加了乙個記錄,我在這樓梯旁的這個位置,我只停一次!
對只停一次。
我把自己的測試資料試了。
8 2.t
.s答案是7沒錯,果斷提交,自信心滿滿的。
回頭一看,wa。。。 我***的黯然神傷了。這尼瑪還有哪點沒考慮到的。
實在是想不通了,點了點discuss,裡面有測試資料,我拿來測了下,
3 4s|.|
-t-.
.|..
我的程式跑出來的是6,尼瑪真的是6啊,明明是7啊。6是怎麼來的。。。。
我頓時覺得我可以在這裡找到我的bug。我也順便測了另一組資料
20 20我的程式是37,答案是20,那些ac的測試的。s.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.t
我頓時覺得,我的程式怎麼是千倉百孔的。。。飆淚中。。。
開始從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 ...