感染人数

发布时间 2023-11-27 21:22:08作者: 鸢凛

7-1 感染人数

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

输入格式:

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

输出格式:

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

输入样例1:

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

输出样例1:

10

输入样例2:

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

输出样例2:

16

解题思路:

  1.先读入方阵大小n和感染天数m,再根据方阵大小读入具体房间数据(注意:char[][]矩阵读取时会将回车,即'\n'读取,记得在一行循环结束时使用getchar()过滤回车)

  2.根据感染天数m开始循环(注意:输入时的方阵即为第一天的情况,我们在判断的时候只需要判断m-1天即可)

  3.我为了方便寻找感染病人,即'@'符号所在的位置,在读取数据的时候使用row[]和column[]数组用来记录'@'符号的具体坐标,之后就不需要循环判断,只需要遍历row[]和column[]数组即可。

  4.在遍历数组根据'@'的坐标判断时,一开始想的方法比较复杂,后来进行了优化,以下是优化版本:

    (1)使用r和c记录'@'的行列坐标值

    (2)判断r是否>0(此处是为了过滤r=0,即'@'上层没有数据的情况),如果满足,再判断r上层是否有健康的人,有则进行感染,将'.'替换为'@'

    (3)判断r是否<n-1(此处是为了过滤r=n-1,即'@'下层没有数据的情况),如果满足,再判断r下层是否有健康的人,有则进行感染,将'.'替换为'@'(一开始的判断条件我错写为<n,导致数组越界,感染的人到r=0处了)

    (4)判断c是否>0(此处是为了过滤c=0,即'@'左侧没有数据的情况),如果满足,再判断c左侧是否有健康的人,有则进行感染,将'.'替换为'@'

    (5)判断c是否<n-1(此处是为了过滤c=n-1,即'@'右侧没有数据的情况),如果满足,再判断c右侧是否有健康的人,有则进行感染,将'.'替换为'@'

  5.依照以上思路实现代码,不要忘记使用count记录感染人数,count同时也是row[]和column[]循环遍历的依据,最后将count输出,则解题完毕

  6.总的来说,这题比较考验细心,比如说我之前在做赋值时将c-1写成c+1,导致一直答案错误,检查时才发现出了这样的问题。

#include<stdio.h>
int main() {
    int n,m;
    scanf("%d %d\n",&n,&m);
    int row[n*n];
    int column[n*n];
    char room[n][n];
    int count = 0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            scanf("%c",&room[i][j]);
            if(room[i][j]=='@'){
                row[count] = i;
                column[count] = j;
                count++;
            }
        }
        getchar();
    }
    for(int i=1;i<m;i++){
        int number = count;
        for(int j=0;j<number;j++){
            int r = row[j];
            int c = column[j];
            if(r>0&&'.'==room[r-1][c]){
                room[r-1][c] = '@';
                row[count] = r-1;
                column[count] = c;
                count++;
            }
            if(r<n-1&&'.'==room[r+1][c]){
                room[r+1][c] = '@';
                row[count] = r+1;
                column[count] = c;
                count++;
            }
            if(c>0&&'.'==room[r][c-1]){
                room[r][c-1] = '@';
                row[count] = r;
                column[count] = c-1;
                count++;
            }
            if(c<n-1&&'.'==room[r][c+1]){
                room[r][c+1] = '@';
                row[count] = r;
                column[count] = c+1;
                count++;
            }
        }
    }
    printf("%d",count);
}