洛谷 P2895 [USACO08FEB]流星雨Meteor Shower 解題報告

一塊兒來看流星雨吧(話說我還沒看到過流星雨呢)html

題目

Problem

小A則據說另外一個駭人聽聞的消息: 一場流星雨即將襲擊整個霸中,因爲流星體積過大,它們沒法在撞擊到地面前燃燒殆盡,屆時將會對它撞到的一切東西形成毀滅性的打擊。node

很天然地,小A開始擔憂本身的安全問題。他必定要在被流星砸到前,到達一個安全的地方(也就是說,一塊不會被任何流星砸到的土地)。c++

若是將霸中放入一個直角座標系中,小A如今的位置是原點,而且小A不能踏上一塊被流星砸過的土地。根據預報,一共有M顆流星(1 \le M \le 50,0001M50,000)會墜落在霸中上,其中第i顆流星會在時刻 T_iTi​​ (0 \le T_i \le 1,0000Ti​​1,000)砸在座標爲(X_i,Y_iXi​​,Yi​​) (0 \le X_i \le 3000Xi​​300;0 \le Y_i \le 3000Yi​​300) 的格子裏。安全

流星的力量會將它所在的格子,以及周圍4個相鄰的格子都化爲焦土,固然小A也沒法再在這些格子上行走。小A在時刻0開始行動,它只能在第一象限中, 平行於座標軸行動,每1個時刻中,她能移動到相鄰的(通常是4個)格子中的任意一個,固然目標格子要沒有被燒焦才行。若是一個格子在時刻t被流星撞擊或燒焦,那麼小A只能在t以前的時刻在這個格子裏出現。spa

請你計算一下,小A最少須要多少時間才能到達一個安全的格子。
注意土地的邊界應該大於流星的邊界,由於若是逃到那些地方也算安全地帶。htm

Input Data

第1行: 1個正整數:M
2..M+2..M+1行: 第i+1i+1行爲3個用空格隔開的整數:X_iXi​​,Y_iYi​​,以及T_iTi​​
blog

Output Data

輸出1個整數,即小A逃生所花的最少時間。若是小A不管如何都沒法在流星雨中存活下來,輸出-1ip

 

 Input / Output Sample

 Input
4
0 0 2
2 1 2
1 1 2
0 3 5

Output
5

題目思路

一道搜索題,求最小步數最好用bfs, 要記錄下每一個區塊被摧毀的時間,具體看代碼it

 

代碼

#include <bits/stdc++.h>
using namespace std;
int n, t[1000][1000], inf, dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1}, ans = 1e9;
bool vis[1000][1000];
struct node{int xx, yy, tt;};
void bfs (){
    queue <node> q; 
    q.push((node){1, 1, 0});
    while (q.size()){
        node tmp = q.front(); q.pop();
        for (int i = 0; i < 4; i++){
           int tx = tmp.xx + dx[i], ty = tmp.yy + dy[i];
           if (vis[tx][ty] or tx < 1 or tx > 302 or ty < 1 or ty > 302) continue; 
             //若越界就跳過, 注意:由於數據範圍最大爲300,因此上限計爲302 
           if (t[tx][ty] <= tmp.tt + 1) continue;
           if (t[tx][ty] == inf) {ans = tmp.tt + 1; return;}  //t[tx][ty]爲inf則是安全區 
           q.push((node){tx, ty, tmp.tt + 1});
           vis[tx][ty] = 1;
        }
    }
}
int main(){
    scanf ("%d", &n);
    memset (t, 0x3f, sizeof (t));  inf = t[1][1];   //將毀壞時間初始化爲最大值 
    for (int i = 1, x, y, ti; i <= n; i++){
        scanf ("%d %d %d", &x, &y, &ti), x++, y++;   //將座標+1後可避免越界 
        t[x][y] = min (t[x][y], ti);   //當同一塊被屢次砸毀時時間取 min 
        for (int i = 0; i < 4; i++)	t[x+dx[i]][y+dy[i]] = min (t[x+dx[i]][y+dy[i]], ti);
    } 
    bfs ();
    if (ans == 1e9) ans = -1;   //若是答案仍爲最大值則沒法走出, 計爲-1; 
    printf ("%d", ans);
    return 0;
} 

  

 點一下左邊的推薦吧!謝謝~~~io

相關文章
相關標籤/搜索