• 【UOJ 359】流感传染


    【题目描述】:
    有一批易感人群住在网格状的宿舍区内,宿舍区为n×n的矩阵,每个格点为一个房间,房间里可能住一个人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。

    【输入描述】:
    第一行一个数字n,表示有n×n的宿舍房间。

    接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。

    接下来的一行是一个整数m。

    【输出描述】:
    输出第m天,得流感的人数

    【样例输入】:
    5
    ....#
    .#.@.
    .#@..
    #....
    .....
    4
    【样例输出】:
    16
    【时间限制、数据范围及描述】:
    时间:1s 空间:512M

    对于 40%的数据:n,m<=100;

    对于100%的数据:n,m<=2000;


    题解:二维bfs,2000* 2000会爆,所以广度搜索。
    每次先存储病人位置,入队列,并累计有多少个初始病人。
    再加上被感染的斌病人,即为最终答案

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<queue>
    using namespace std;
    
    struct node{
        int x,y,day;
    }s,bf;
    
    int n,m,vc,ans;
    char a[2007][2005];
    queue<node> q;
    
    void init(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",a[i]+1);
            for(int j=1;j<=n;j++)
                if(a[i][j]=='@'){
                    s.x=i;
                    s.y=j;
                    s.day=1;
                    q.push(s);
                    vc++;
                    //存储该病人位置 
                }
        }
        scanf("%d",&m);
    }
    
    void work(){
        while(!q.empty()){
            s=q.front();//取队头 
            q.pop();
            if(s.day>=m) break;
            if(a[s.x-1][s.y]=='.' && s.x-1>0){
                a[s.x-1][s.y]='@'; ans++;
                bf.x=s.x-1; bf.y=s.y; bf.day=s.day+1; q.push(bf);//入队 
            }
            if(a[s.x][s.y-1]=='.' && s.y-1>0){
                a[s.x][s.y-1]='@'; ans++;
                bf.x=s.x; bf.y=s.y-1; bf.day=s.day+1; q.push(bf);
            }
            if(a[s.x+1][s.y]=='.' && s.x+1<=n){
                a[s.x+1][s.y]='@'; ans++;
                bf.x=s.x+1; bf.y=s.y; bf.day=s.day+1; q.push(bf);
            }
            if(a[s.x][s.y+1]=='.' && s.y+1<=n){
                a[s.x][s.y+1]='@'; ans++;
                bf.x=s.x; bf.y=s.y+1; bf.day=s.day+1; q.push(bf);
            }
        }
        printf("%d
    ",ans+vc);
    } 
    int main(){
        init();
        work();
        return 0;
    }
  • 相关阅读:
    Shell之sed用法 转滴
    再议mysql 主从配置
    CentOS 如何将.deb 文件 转换.rpm
    scp命令[转]
    安装samba服务器
    xdebug影响php运行速度
    PHP中VC6、VC9、TS、NTS版本的区别与用法详解
    将Centos的yum源更换为国内的阿里云源
    centos网卡错误Device eth0 does not seem to be present
    虚拟机VirtualBox中centos6.5网络设置
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11133496.html
Copyright © 2020-2023  润新知