题解 P1332 【血色先锋队】

关于本题题面与事实的严重不符,蒟蒻无言以对(mmp) 先摆上痛苦历程:

NO.1 WA爆零。。输出忘了换行

NO.2 10分,其余WA,静态调试10分钟,未发现错误,看了题解发现范围不对

NO.3 0分 MLE 数组开5000*5000

NO.4 AC。。。。。!!!

其实这个题目还是很好理解的,最关键的是将所有污染源一开始全部压进队列通过其本身迭代完美达到所有感染源同时开始的效果

{每次第一次拓展到的点就是最少次数//也就是时间//,有兴趣可以自己画一画) 附上代码与解释:

#include<bits/stdc++.h>
#define N 3001 //宏定义 
using namespace std;
struct node   //队列结构体     
{
    int x,y,s;
};
queue<node>q;
int f[N][N],a[N][N],n,m,x,y,aa,b,c[25001][3],p[25001][3];
// f数组判断是否感染过 a表示拓展此点的时间  
int dx[5]={0,-1,0,1,0},dy[5]={0,0,1,0,-1};  //方向数组 
int main()
{
    scanf("%d%d%d%d\n",&n,&m,&aa,&b);
    memset(f,0,sizeof f);
    memset(a,0,sizeof a);
    for (int i=1; i<=aa; i++)   cin>>c[i][1]>>c[i][2];
    for (int i=1; i<=b; i++)    
    {
        cin>>x>>y;
        p[i][1]=x; p[i][2]=y;   //存领主 
    }
    node t;
    for (int i=1; i<=aa; i++)    //将所有污染源压入队列,时间为0 
      {
        t.x=c[i][1]; t.y=c[i][2]; t.s=0;
        f[c[i][1]][c[i][2]]=1;
        q.push(t);
      }
    while (!q.empty())    //广搜主题 
    {
        node xt=q.front();
        q.pop();
        for (int i=1; i<=4; i++)
          {
            int xx=xt.x+dx[i],yy=xt.y+dy[i];
            if (xx>=1&&xx<=n&&yy>=1&&yy<=m&&f[xx][yy]!=1)
              { 
                f[xx][yy]=1; a[xx][yy]=xt.s+1;
                t.x=xx; t.y=yy; t.s=xt.s+1;
                q.push(t);
                }
          }
    }
    for (int i=1; i<=n; i++)
    cout<<a[p[i][1]][p[i][2]]<<endl;  //按题目意思输出 
}

猜你喜欢

转载自www.cnblogs.com/thinkl/p/11266933.html