PTA 感染人数

发布时间 2023-11-28 21:32:45作者: 吧拉吧拉吧

7-1 感染人数

作者 黄龙军  单位 绍兴文理学院
设某住宿区域是一个n×n的方阵,方阵中的每个小方格为一个房间,房间里可能住一个人,也可能空着。第一天,某些房间中住着的人得了一种高传染性的流感,以后每一天,得流感的人会使其邻居(住在其上、下、左、右方向存在的房间里面的人)传染上流感,请问:第m天总共有多少人得流感?

输入格式:

第一行输入两个整数n,m(1<n20,1m100),含义如上述;接着输入n行,每行n个字符,表示住宿区域第一天的房间情况,其中,@表示当天该房间住着得流感的人,.表示该房间住着健康的人,#表示该房间是空的。

输出格式:

输出一个整数,表示第m天得了流感的人数。

输入样例1:

5 3
#....
.....
...##
.#.@.
@.#..

输出样例1:

10

输入样例2:

5 4
....#
.#.@.
.#@..
#....
.....

输出样例2:

16

分析:

  1. 输入住宿人群的情况时要注意回车的输入
  2. 因为要求的是m天内总共感染的人数,第一天是给出的感染人数,所以循环天数要减1次。
  3. 因为所求天数m天内都会有新的人被感染,所以要将新感染的人和前一天/初始被感染的人区分开。所以给新感染人设置一个不同的符号(例如:‘1’或者其他都可以)。同时循环到当前房间时,它左边那一个和上面那一个当天已经遍历过了,就可以直接设置为‘@’,而右边和下面没有,先设置为‘1’,然后多加一个判断是不是‘1’,是就将其改为‘@’;或者把上下左右都改成‘1’,最后一起改成‘@’。

通过的代码:

#include<iostream>
using namespace std;
int main(){
    int n,m;
    cin>>n>>m;
    char a[n][n];
    cin.get();
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            a[i][j]=cin.get();
        }
        cin.get();
    }
    for(int k=1;k<m;k++){
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(a[i][j]=='@'){
                    if(i>0&&a[i-1][j]=='.') a[i-1][j]='@';
                    if(i<n-1&&a[i+1][j]=='.') a[i+1][j]='1';
                    if(j>0&&a[i][j-1]=='.') a[i][j-1]='@';
                    if(j<n-1&&a[i][j+1]=='.') a[i][j+1]='1';
                }
                if(a[i][j]=='1'){
                    a[i][j]='@';
                }
            }
        }
    }
    int count=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(a[i][j]=='@') count++;
        }
    }
    cout<<count<<endl;
}