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

    题目描述

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

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

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

    在这里插入图片描述
    输入

    第1行:四个整数N,M,A,B,表示军团矩阵有N行M列。有A个感染源,B为血色敢死队中领主的数量。
    接下来A行:每行有两个整数x,y,表示感染源在第x行第y列。
    接下来B行:每行有两个整数x,y,表示领主的位置在第x行第y列。
    输出

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

    5 4 2 3
    1 1
    5 4
    3 3
    5 3
    2 4
    输出样例

    3
    1
    3
    说明

    数据规模
    1<=M,N<=500
    1<=A,B<=M*N

    .
    .
    .
    .
    .
    分析
    直接bfs

    .
    .
    .
    .
    .
    程序:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; 
    int gry[300000][3],n1,n,m,a[510][510],m1;
    bool f[510][510];
    
    void bfs(int num)
    {
        int head=0,tail=n1;
        while (head<tail)
        {
            head++;
            for (int i=0;i<=3;i++)
            {
                int x=gry[head][0]+d[i][0];
                int y=gry[head][1]+d[i][1];
                if (x>=1&&x<=n&&y>=1&&y<=m&&f[x][y]==false) 
                {
                    tail++;
                    gry[tail][0]=x;
                    gry[tail][1]=y;
                    a[x][y]=gry[tail][2]=gry[head][2]+1; 
                    f[x][y]=true; 
                }
            }
        }
    }
    int main()
    {
        scanf("%d%d%d%d",&n,&m,&n1,&m1);
        memset(f,false,sizeof(f));
        for (int i=1;i<=n1;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            gry[i][0]=x; 
            gry[i][1]=y;
            f[x][y]=true;
        }
        bfs(n1);
        for (int i=1;i<=m1;i++)
        {
        	int x,y;
        	scanf("%d%d",&x,&y);
        	printf("%d
    ",a[x][y]);
        } 
        return 0;
    }
    
  • 相关阅读:
    python3全栈开发-并发编程的多进程理论
    python3全栈开发-补充UDP的套接字、操作系统、并发的理论基础
    python3全栈开发-什么是粘包、粘包现象、如何解决粘包
    python3全栈开发-socket编程
    python3全栈开发- 元类metaclass(面试必考题)
    浏览器窗口
    SQL 笔记
    数据库连接字符串
    获取网卡地址信息
    启动所选择的应用程序
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/11094924.html
Copyright © 2011-2022 走看看