P2895 [USACO08FEB]Meteor Shower S

  • 初始化\(g[i][j]\)为INF表示没被炸毁
  • 导弹连同周围四个区域一同炸毁
  • 多次炸毁的区域炸毁时间取第一次炸毁的时间
const int N=50010;
int g[310][310];
int dist[310][310];
int n;

bool check(int x,int y)
{
    return x>=0 && y>=0;
}

int bfs()
{
    memset(dist,-1,sizeof dist);
    queue<PII> q;
    q.push({0,0});
    dist[0][0]=0;

    while(q.size())
    {
        PII t=q.front();
        q.pop();

        int x=t.fi,y=t.se;

        if(g[x][y] == INF) return dist[x][y];

        for(int i=0;i<4;i++)
        {
            int a=x+dx[i],b=y+dy[i];
            if(!check(a,b) || ~dist[a][b]) continue;

            if(g[a][b]==INF || g[a][b] > dist[x][y]+1)
            {
                dist[a][b]=dist[x][y]+1;
                q.push({a,b});
            }
        }
    }
    return -1;
}

int main()
{
    cin>>n;

    memset(g,0x3f,sizeof g);

    for(int i=0;i<n;i++)
    {
        int x,y,t;
        cin>>x>>y>>t;
        g[x][y]=min(g[x][y],t);
        for(int i=0;i<4;i++)
        {
            int a=x+dx[i],b=y+dy[i];
            if(check(a,b)) g[a][b]=min(g[a][b],t);
        }
    }

    int t=bfs();
    cout<<t<<endl;

    //system("pause");
}
原文地址:https://www.cnblogs.com/fxh0707/p/13674588.html