USACO2008Feb T2流星雨

題目描述
去年偶們湖南FJ的農場遭受N年不遇到冰凍災害,現在芙蓉哥哥(FJ)則聽說另一個駭人聽聞的消息: 一場流星雨即將襲擊整個霸中農場,由於流星體積過大,它們無法在撞擊到地面前燃燒殆盡, 屆時將會對它撞到的一切東西造成毀滅性的打擊。很自然地,芙蓉哥哥開始擔心自己的 安全問題。以霸中至In型男名譽起誓,他一定要在被流星砸到前,到達一個安全的地方 (也就是說,一塊不會被任何流星砸到的土地)。如果將霸中放入一個直角座標系中, 芙蓉哥哥現在的位置是原點,並且,芙蓉哥哥不能踏上一塊被流星砸過的土地。根據預 報,一共有M顆流星(1 <= M <= 50,000)會墜落在霸中上,其中第i顆流星會在時刻 T_i (0 <= T_i <= 1,000)砸在座標爲(X_i, Y_i) (0 <= X_i <= 300;0 <= Y_i <= 300) 的格子裏。流星的力量會將它所在的格子,以及周圍4個相鄰的格子都化爲焦土,當然 芙蓉哥哥也無法再在這些格子上行走。芙蓉哥哥在時刻0開始行動,它只能在第一象限中, 平行於座標軸行動,每1個時刻中,她能移動到相鄰的(一般是4個)格子中的任意一個, 當然目標格子要沒有被燒焦才行。如果一個格子在時刻t被流星撞擊或燒焦,那麼芙蓉哥哥只能在t之前的時刻在這個格子裏出現。請你計算一下,芙蓉哥哥最少需要多少時間才能到 達一個安全的格子。
題目被人改了,本來都是FJ的,什麼湖南,芙蓉哥哥,逗我···
輸入描述
第1行: 1個正整數:M * 第2..M+1行: 第i+1行爲3個用空格隔開的整數:X_i,Y_i,以及T_i
輸出描述
輸出1個整數,即芙蓉哥哥(FJ)逃生所花的最少時間。如果芙蓉哥哥(FJ)無論如何都無法在流星雨中存活下來,輸出-1
樣例輸入
4
0 0 2
2 1 2
1 1 2
0 3 5
輸入說明:
一共有4顆流星將墜落在霸中,它們落地點的座標分別是(0, 0),(2, 1),(1, 1)以及(0, 3),時刻分別爲2,2,2,5。
t = 0 t = 2 t = 5
5|… … . 5|… … . 5|… … .
4|… … . 4|… … . 4|# … …
* = 流星落點
3|… … . 3|… … . 3| # … . .*
* 2|… … . 2|. # # … . 2|# # # … .*
# = 行走禁區
1|… … . 1|# * * # … 1|# # # # …
0|B … … 0|* # # … . 0|# # # … .
————– ————– ————–
0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3 4 5 6
樣例輸出
5
輸出說明:
如果我們觀察在t=5時的霸中,可以發現離芙蓉哥哥最近的安全的格子是
(3,0)——不過由於早在第二顆流星落地時,芙蓉哥哥直接跑去(3,0)的路線就被封死了。
離芙蓉哥哥第二近的安全格子爲(4,0),但它的情況也跟(3,0)一樣。再接下來的格子就是在
(0,5)-(5,0)這條直線上。在這些格子中,(0,5),(1,4)以及(2,3)都能在5個單位時間內到達。
5|… … .
4|… … .
3|3 4 5 … . 某個合法的逃生方案中
2|2 … … 芙蓉哥哥每個時刻所在地點
1|1 … …
0|0 … …
————–
0 1 2 3 4 5 6

BFS,向四個方向尋找可行道路,(0,0)-(300,300)以外的範圍都是安全的,人初始站位有可能不安全,要注意判斷

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
const int N=305,dx[4]={1,-1,0,0},dy[4]={0,0,-1,1};
struct node
{
    int x,y,n;
};
int map[N][N],m,ans;
bool vis[N][N],flag;
queue<node>q;
void bfs()
{
    int i;
    node k;
    k.x=0;
    k.y=0;
    k.n=0;
    q.push(k);
    vis[0][0]=true;
    while(!q.empty())
    {
        node now=q.front();q.pop();
        if(map[now.x][now.y]==-1)
        {
            flag=true;
            ans=now.n;
            return;
        }
        for(i=0;i<4;i++)
        {
            node next=now;
            next.x+=dx[i];
            next.y+=dy[i];
            next.n++;
            if(next.x>=0&&next.x<=N&&next.y>=0&&next.y<=N&&!vis[next.x][next.y]&&(next.n<map[next.x][next.y]||map[next.x][next.y]==-1))
            {
                vis[next.x][next.y]=true;
                q.push(next);
            }
        }
    }
}
int main()
{
    freopen("meteor.in","r",stdin);
    freopen("meteor.out","w",stdout);
    int a,b,t,i,j,nx,ny;
    cin>>m;
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            map[i][j]=-1;
    for(i=1;i<=m;i++)
    {
       cin>>a>>b>>t;
       if(map[a][b]==-1||t<map[a][b])
           map[a][b]=t;
       for(j=0;j<4;j++)
       {
          nx=a+dx[j];
          ny=b+dy[j];
          if(nx>=0&&nx<N&&ny>=0&&ny<N&&(map[nx][ny]==-1||t<map[nx][ny]))
              map[nx][ny]=t;
       }
    }
    bfs();
    if(flag)
        cout<<ans;
    else
        cout<<-1;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章