代码打卡-感染人数

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

输入格式:

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

输出格式:

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

输入样例1:

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

输出样例1:

10

输入样例2:

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

输出样例2:

16

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

c语言:

#include<stdio.h>

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    char c[n][n];
    getchar(); // Consume the newline character after reading 'm'
    
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            c[i][j] = getchar();
        }
        getchar(); // Consume the newline character after each row
    }

    for (int k = 1; k < m; k++) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (c[i][j] == '@') {
                    if (i > 0 && c[i - 1][j] == '.') c[i - 1][j] = '*'; //上
                    if (i < n - 1 && c[i + 1][j] == '.') c[i + 1][j] = '*'; //下
                    if (j > 0 && c[i][j - 1] == '.') c[i][j - 1] = '*'; //左
                    if (j < n - 1 && c[i][j + 1] == '.') c[i][j + 1] = '*'; //右
                }
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (c[i][j] == '*') c[i][j] = '@';
            }
        }
    }
    
    int count = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (c[i][j] == '@') count++;
        }
    }

    printf("%d", count);

    return 0;
}

这段代码是一个模拟程序,其设计思路是模拟一个在二维字符数组上移动的过程。以下是代码的设计思路以及涉及到的主要知识点:

1. **输入:**
   - 通过`scanf`函数读取两个整数 `n` 和 `m`,分别表示二维数组的大小和模拟的移动次数。
   - 通过嵌套的`for`循环,使用`getchar`逐个读取字符,填充二维字符数组 `c`。

2. **模拟移动过程:**
   - 使用三层嵌套的`for`循环遍历二维数组,查找字符数组中的 '@',表示移动的起始点。
   - 根据 '@' 的位置,判断上下左右四个方向上的点,如果是 '.',则将其标记为 '*',表示移动后的位置。
   - 完成一轮移动后,再次遍历数组,将所有标记为 '*' 的点更新为 '@',表示下一轮移动的起始点。

3. **统计最终结果:**
   - 使用两层嵌套的`for`循环遍历数组,统计数组中 '@' 的个数,即为最终结果。
   - 使用`printf`输出结果。

4. **注意事项:**
   - 在 C 中,字符数组的大小不能用变量表示,所以这里使用了可变长度数组(Variable Length Array,VLA)。
   - 使用`getchar`来读取字符,注意在读取数字后,需要使用额外的`getchar`来处理输入中的换行符。
   - 替换了C++的`cin`和`cout`,使用了`scanf`和`printf`进行输入输出操作。

这段代码主要涉及到的知识点包括:C 语言基础、输入输出操作、字符数组的使用、循环结构、条件语句等。同时,通过这个例子,也可以学到在 C 语言中如何模拟简单的二维数组操作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值