poj Meteor Shower

这道题是下流星,流星会下到上下左右中的位置,而且有时间的,要你求出最短到达安全位置的时间。

这道题要注意边界是可以超过300的

#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
using namespace std;
typedef pair<int,int> P;
#define INF 0x3f3f3f3f
queue<P>q;
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
int d[306][306];
int dd[306][306];
int gx,gy;
int flag=0;
int dfs()
{
    memset(dd,INF,sizeof(dd));
    q.push(P(0,0));
    dd[0][0]=0;
    while(q.size())
    {
        P p=q.front();q.pop();
        if(d[p.first][p.second]==INF){
                gx=p.first;
                gy=p.second;
                flag=1;
              break;
        }
        for(int i=0;i<4;i++)
        {
            int nx=p.first+dx[i],ny=p.second+dy[i];
            if(0<=nx&&nx<=305&&0<=ny&&ny<=305&&dd[nx][ny]==INF)
              {//printf("%d %d %d\n",nx,ny,d[nx][ny]);
                  dd[nx][ny]=dd[p.first][p.second]+1;
                  if(dd[nx][ny]<d[nx][ny])
                  q.push(P(nx,ny));
              }
        }
    }
    if(flag)
    return dd[gx][gy];
    else return -1;
}
int main()
{
   int m,x,y,t,n;
   scanf("%d",&n);
   memset(d,INF,sizeof(d));
   for(int i=0;i<n;i++)
   {
       scanf("%d %d %d",&x,&y,&t);
       d[x][y]=min(d[x][y],t);
     for(int i=0;i<4;i++)
      {
          int nx=x+dx[i],ny=y+dy[i];
          if(0<=nx&&nx<=305&&0<=ny&&ny<=305)
         d[nx][ny]=min(d[nx][ny],t);
      }
   }
   int res=dfs();
   printf("%d\n",res);
}
posted @ 2018-05-02 22:56  better46  阅读(290)  评论(0编辑  收藏  举报