USACO 2008 Feb Silver 2.Meteor Shower

传送门

题目描述:

牛去看流星雨,不料流星掉下来会砸毁上下左右中五个点。每个流星掉下的位置和时间都不同,求牛能否活命,如果能活命,最短的逃跑时间是多少?

Sample Input

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

Sample Output

5

HINT

      t = 0                t = 2              t = 5
5|. . . . . . .     5|. . . . . . .     5|. . . . . . .    
4|. . . . . . .     4|. . . . . . .     4|# . . . . . .   * = meteor impact
3|. . . . . . .     3|. . . . . . .     3|* # . . . . .  
2|. . . . . . .     2|. # # . . . .     2|# # # . . . .   # = destroyed pasture
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|. . . . . . . 
4|. . . . . . . 
3|3 4 5 . . . .  Bessie's locations over time 
2|2 . . . . . .  for one solution 
1|1 . . . . . . 
0|0 . . . . . . 
  -------------- 
  0 1 2 3 4 5 6

思路:

因为流星掉落时间确定,所以本题就是让我们找一个流星砸不到的地方。
我们可以先预处理出所有流星掉落后哪些地不能走,然后再搜索;
一个点能被到达的条件是:当牛到达这个点时没有被流星砸毁,或永远也不会被流星砸毁(答案)
注意:本题中流星掉落时间可为0,所以我们要将预处理数组设为-1;

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
bool book[2000][2000];
int a[2100][2100];
int dx[6]={0,1,-1,0,0,0};
int dy[6]={0,0,0,1,-1,0};
struct your
{
    int x,y,step;
};
void make(int x,int y,int t)
{
    for(int i=1;i<=5;i++)
    {
        int dxx=x+dx[i];
        int dyy=y+dy[i];
        if(dxx>=0&&dyy>=0)
        {
            if(a[dxx][dyy]==-1)
                a[dxx][dyy]=t;
            else a[dxx][dyy]=min(a[dxx][dyy],t);
        }
    }   
}
void bfs()
{
    queue<your>q;
    book[0][0]=1;
    your nmp;
    nmp.x=nmp.y=0,nmp.step=0;
    q.push(nmp);
    while(q.size())
    {
        nmp=q.front();q.pop();
        for(int i=1;i<=4;i++)
        {
            int dxx=nmp.x+dx[i];
            int dyy=nmp.y+dy[i];
            if(dxx<0||dyy<0) continue;
            if(a[dxx][dyy]==-1)
            {
                printf("%d",nmp.step+1);
                return ;
            }
            if(book[dxx][dyy]==0&&a[dxx][dyy]>nmp.step+1)
            {
                your temp;
                temp.x=dxx,temp.y=dyy;
                temp.step=nmp.step+1;
                q.push(temp);
                book[dxx][dyy]=1;
            }
        }
    }
    printf("-1");
}
int main()
{
    memset(a,-1,sizeof a);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x,y,t;
        scanf("%d%d%d",&x,&y,&t);
        make(x,y,t);
    }
    bfs();
}

发表评论

邮箱地址不会被公开。 必填项已用*标注