设某住宿区域是一个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 语言中如何模拟简单的二维数组操作。