一塊兒來看流星雨吧(話說我還沒看到過流星雨呢)html
小A則據說另外一個駭人聽聞的消息: 一場流星雨即將襲擊整個霸中,因爲流星體積過大,它們沒法在撞擊到地面前燃燒殆盡,屆時將會對它撞到的一切東西形成毀滅性的打擊。node
很天然地,小A開始擔憂本身的安全問題。他必定要在被流星砸到前,到達一個安全的地方(也就是說,一塊不會被任何流星砸到的土地)。c++
若是將霸中放入一個直角座標系中,小A如今的位置是原點,而且小A不能踏上一塊被流星砸過的土地。根據預報,一共有M顆流星(1 \le M \le 50,0001≤M≤50,000)會墜落在霸中上,其中第i顆流星會在時刻 T_iTi (0 \le T_i \le 1,0000≤Ti≤1,000)砸在座標爲(X_i,Y_iXi,Yi) (0 \le X_i \le 3000≤Xi≤300;0 \le Y_i \le 3000≤Yi≤300) 的格子裏。安全
流星的力量會將它所在的格子,以及周圍4個相鄰的格子都化爲焦土,固然小A也沒法再在這些格子上行走。小A在時刻0開始行動,它只能在第一象限中, 平行於座標軸行動,每1個時刻中,她能移動到相鄰的(通常是4個)格子中的任意一個,固然目標格子要沒有被燒焦才行。若是一個格子在時刻t被流星撞擊或燒焦,那麼小A只能在t以前的時刻在這個格子裏出現。spa
請你計算一下,小A最少須要多少時間才能到達一個安全的格子。
注意土地的邊界應該大於流星的邊界,由於若是逃到那些地方也算安全地帶。htm
第1行: 1個正整數:MM
第2..M+2..M+1行: 第i+1i+1行爲3個用空格隔開的整數:X_iXi,Y_iYi,以及T_iTiblog
輸出1個整數,即小A逃生所花的最少時間。若是小A不管如何都沒法在流星雨中存活下來,輸出-1ip
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