设某住宿区域是一个n×n的方阵,方阵中的每个小方格为一个房间,房间里可能住一个人,也可能空着。第一天,某些房间中住着的人得了一种高传染性的流感,以后每一天,得流感的人会使其邻居(住在其上、下、左、右方向存在的房间里面的人)传染上流感,请问:第m天总共有多少人得流感?
输入格式:
第一行输入两个整数n,m(1<n≤20,1≤m≤100),含义如上述;接着输入n行,每行n个字符,表示住宿区域第一天的房间情况,其中,@
表示当天该房间住着得流感的人,.
表示该房间住着健康的人,#
表示该房间是空的。
输出格式:
输出一个整数,表示第m天得了流感的人数。
输入样例1:
5 3
#....
.....
...##
.#.@.
@.#..
输出样例1:
10
输入样例2:
5 4
....#
.#.@.
.#@..
#....
.....
输出样例2:
设某住宿区域是一个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(); // 获取换行符
// 读取每天住宿区域的情况
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
c[i][j] = getchar(); // 逐个字符读取
}
getchar(); // 获取换行符
}
// 对于每一天的操作
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); // 输出最终得了流感的人数
}