zoukankan      html  css  js  c++  java
  • P1332 血色先锋队

    P1332 血色先锋队

    题目描述

    巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围,现在他们将主力只好聚集了起来,以抵抗天灾军团的围剿。可怕的是,他们之中有人感染上了亡灵瘟疫,如果不设法阻止瘟疫的扩散,很快就会遭到灭顶之灾。大领主阿比迪斯已经开始调查瘟疫的源头。原来是血色先锋军的内部出现了叛徒,这个叛徒已经投靠了天灾军团,想要将整个血色先锋军全部转化为天灾军团!无需惊讶,你就是那个叛徒。在你的行踪败露之前,要尽快完成巫妖王交给你的任务。

    军团是一个N行M列的矩阵,每个单元是一个血色先锋军的成员。感染瘟疫的人,每过一个小时,就会向四周扩散瘟疫,直到所有人全部感染上瘟疫。你已经掌握了感染源的位置,任务是算出血色先锋军的领主们感染瘟疫的时间,并且将它报告给巫妖王,以便对血色先锋军进行一轮有针对性的围剿。

    输入输出格式

    输入格式:

    第1行:四个整数N,M,A,B,表示军团矩阵有N行M列。有A个感染源,B为血色敢死队中领主的数量。

    接下来A行:每行有两个整数x,y,表示感染源在第x行第y列。

    接下来B行:每行有两个整数x,y,表示领主的位置在第x行第y列。

    【数据规模】

    1<=M,N<=500

    1<=A,B<=M*N

    输出格式:

    第1至B行:每行一个整数,表示这个领主感染瘟疫的时间,输出顺序与输入顺序一致。如果某个人的位置在感染源,那么他感染瘟疫的时间为0。

    输入输出样例

    输入样例#1:
    5 4 2 3
    1 1
    5 4
    3 3
    5 3
    2 4
    
    输出样例#1:
    3
    1
    3

    说明

    如下图,标记出了所有人感染瘟疫的时间以及感染源和领主的位置。

    广搜,搜全图

     1 #include<cstdio>
     2 #include<queue>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 const int MAXN = 510;
     7 struct node{
     8     int x,y;
     9 }cur,nxt;
    10 struct que{
    11     int x,y;
    12 }que[250100];
    13 int ans[MAXN][MAXN];
    14 bool v[MAXN][MAXN];
    15 int dx[4] = {0,0,1,-1};
    16 int dy[4] = {1,-1,0,0};
    17 int a,b,n,m;
    18 queue<node>q;
    19 
    20 int main()
    21 {
    22     scanf("%d%d%d%d",&n,&m,&a,&b);
    23     for (int x,y,i=1; i<=a; ++i)    
    24     {
    25         scanf("%d%d",&x,&y);
    26         cur.x = x;
    27         cur.y = y;
    28         q.push(cur); 
    29         v[x][y] = true;
    30         ans[x][y] = 0;
    31     }
    32     for (int x,y,i=1; i<=b; ++i)
    33     {
    34         scanf("%d%d",&x,&y);
    35         que[i].x = x;
    36         que[i].y = y;
    37     }
    38     while (!q.empty())
    39     {
    40         cur = q.front();
    41         q.pop();
    42         for (int i=0; i<4; ++i)
    43         {
    44             int xx = cur.x+dx[i];
    45             int yy = cur.y+dy[i];
    46             if (xx>0&&yy>0&&xx<=n&&yy<=m&&!v[xx][yy])
    47             {
    48                 v[xx][yy] = true;
    49                 ans[xx][yy] = ans[cur.x][cur.y]+1;
    50                 nxt.x = xx;
    51                 nxt.y = yy;
    52                 q.push(nxt);
    53             } 
    54         }
    55     }
    56     for (int i=1; i<=b; ++i)
    57         printf("%d
    ",ans[que[i].x][que[i].y]);
    58     return 0;
    59 }
  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/mjtcn/p/7071721.html
Copyright © 2011-2022 走看看