7-1 感染人数

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

输入格式:

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

输出格式:

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

输入样例1:

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

输出样例1:

10

输入样例2:

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

输出样例2:

16
#include <stdio.h>

int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  char c[n][n];
  getchar(); // 用于消除输入n和m后的回车

  // 输入字符矩阵
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      c[i][j] = getchar();
    }
    getchar(); // 用于消除每行输入后的回车
  }

  // 进行m-1次迭代
  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. 变量声明与输入

    • int n, m;n是矩阵的大小(矩阵是一个方形的,大小为n x n),而m是扩散的迭代次数。
    • char c[n][n];:这是一个字符矩阵,用于存储每个位置的状态。状态有两种:@表示已经感染,.表示未感染。
  2. 输入处理

    • 使用scanf读取nm的值,然后用getchar()读取换行符,这样在读取矩阵时就不会被这个换行符干扰。
    • 通过两层循环读取矩阵中的每个字符。
  3. 扩散过程

    • 程序模拟m-1次扩散过程(因为for(int k=1; k<m; k++))。
    • 在每次迭代中,程序遍历矩阵中的每个元素。如果元素是@,则检查其上下左右的元素。如果这些元素是.(未感染),则将其标记为*(即临时状态,表示新感染)。
  4. 更新状态

    • 完成一轮扩散后,程序通过另一个双重循环将所有标记为*的元素改为@。这表示新感染的元素在下一轮迭代中也会参与扩散。
  5. 计数与输出

    • 最后,程序再次遍历矩阵,计算感染(@)的元素数量,并输出这个数量。
  6. 逻辑细节

    • 在检查每个元素的四周时,代码会先检查索引是否在矩阵范围内,以避免数组越界的错误。
    • 程序使用了临时状态*来标记新感染,避免在同一轮迭代中被重复计算。

总的来说,这个程序模拟了一个简单的传播过程,通过字符矩阵展示了每轮传播后的状态。这种类型的模拟可以用于理解各种扩散现象,例如疾病传播、信息扩散等。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值