卡在2星期前,今天終於搞掂了。
先說下題目大意吧。
流星雨來襲擊我們的女主牛了,bessie。為了找乙個安全地方,她開始逃了。地圖相當於平面座標系第一象限,bessie一開始在原點。然後,每顆流星都會在某個時刻砸下來,砸到的地方連同上下左右都會被毀滅,此時這些地方bessie就不能通過了,她只能走其它地方。bessie的移動速度是每時刻移動一步,上下左右,不能對角線移動。現在求bessie最小的移動步數。
看到最小的,就立馬反應,bfs。可是,這個地圖不好弄,每個時刻都會更新,如果我們每個時刻跟新一下地圖,bfs一下。這樣就很麻煩了,有沒有其它方法?
一開始就把地圖弄好,被流星砸到的位置用砸到的時間表示。
map[i][j] = min;
這就有乙個問題了,給出的資料不是按順序給出的。先來看一下題目,被砸到的地方不能通過,如果map[i][j]儲存的是晚砸到的時間,我們使用bfs得出的答案就會出錯,因為這個位置早就不能通過的。所以要保證這個被砸到的map[i][j]是最小的時間。
其實,處理起來也很簡單。一開始把地圖初始化為-1.
for(int i = 0;i=0&&nx<=300&&ny>=0&&ny<=300&&(t這裡博主沒有用陣列,而是輸入乙個處理乙個。如果輸入的t>map[i][j],我們就跟新map[i][j]。
地圖弄好了,其它都好辦了。
接下來,考慮怎麼儲存bessie的狀態。
弄成乙個struct,或者class
typedef structstate;
剩下沒什麼好說的,常規bfs。
在判斷下一步可不可以移動時,我們要注意,如果bessie移動到這個位置,時間剛好等於map[i][j],那bessie就會被砸死。
要提前看
state s;
s.t > map[i][j]//大於就可以移動
測試資料,用txt儲存。比如儲存為1.txt
然後freopen(「1.txt」,」r」,stdin)改變我們的標準輸入流,這樣就不用乙個乙個輸了,答案是13
23 2 5 10
1 3 5
5 3 12
3 3 9
1 8 7
8 4 15
2 3 7
0 0 2
6 7 10
4 4 10
3 7 7
8 5 13
0 4 9
2 6 8
0 2 4
6 4 12
0 6 7
4 2 10
1 4 7
4 6 10
5 5 12
6 5 14
2 1 2
POJ 3669題目解答
poj 3669題目解答 bessie被流星雨襲擊,給出m顆流星,每個流星都有墜落的橫縱座標,以及墜落的時間。每個流星墜落後,該格仔連同上 下 左 右四個格仔都不能走了。bessie從 0,0 出發,每次只能向上 下 左 右移動一格,求達到安全位置的最小移動次數,不能則輸出 1。思路 地圖的大小沒有...
POJ 3669廣度優先搜尋
這是一道典型的廣度優先搜尋bfs題目。首先宣告一下,我在這裡借鑑了別人的想法 這是原文答案,題目大意 流星雨即將攻擊地球,當然數目是有限的,共n個,攻擊到某個點時將會使該點及其上下左右四個點都被摧毀。乙個女的,不想被擊中啊,就跑啊。她要在地球上找到乙個地方讓她能夠度過災難。把整個地圖看作一張二維表,...
poj3669 流星雨啊
poj3669這道題我看了好像兩三天的樣子 迷之tle,迷之mle,迷之wa 後來發現,問題有點兒多.一共三個問題,一是讀入流星的時候,沒有考慮前面流星對後面流星的影響.二是 小主人公可以跑到300 300的格仔外面.三是 走路的時候,忘了判斷路是否已經走過 include include incl...