【题解】流感传染
【题目描述】
有一批易感人群住在网格状的宿舍区内,宿舍区为n\*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
【输入描述】
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100。
【输出描述】
输出第m天,得流感的人数。
【样例输入】
5 ....# .#.@. .#@.. #.... ..... 4
【样例输出】
16
【题目分析】
这种类型的输入是一个小问题,考虑getchar()
可以用三重循环,但是非常不建议。
当天感染的人不传染,第二天才传染。
【二维数组+三重循环】
#include <bits/stdc++.h>
using namespace std;
int m, n;
char a[105][105];
int cnt=0;
int main() {
int n;
// freopen("10.in","r",stdin);
// freopen("10.out","w",stdout);
cin >> n;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
cin >> m;
for(int i = 2; i <= m; i++) {//递推从第二天到第m天
for(int j = 1; j <= n; j++) {
for(int k = 1; k <= n; k++) {
if (a[j][k] == '.') {//如果住人
//如果隔壁有病人
if (a[j - 1][k] == '@' || a[j + 1][k] == '@'
|| a[j][k - 1] == '@' || a[j][k + 1] == '@') {
a[j][k]='*';//被感染
}
}
}
}
for(int j = 1; j <= n; j++) {//被感染的人发病
for(int k = 1; k <= n; k++) {
if (a[j][k] == '*') {
a[j][k]='@';//变成病人
}
}
}
}
for(int i = 1; i <= n; i++) {//循环统计病人个数
for(int j = 1; j <= n; j++) {
if ( a[i][j]=='@'){
cnt++;
}
}
}
cout<<cnt;
return 0;
}【BFS版本】
#include <iostream>
#include <queue>
using namespace std;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
// 定义结构体,存储感染者的位置和天数
struct Node {
int x, y; // 位置
int day; // 感染天数
};
int main() {
int n, m;
//freopen("5.in","r",stdin);
//freopen("5.out","w",stdout);
cin >> n;
char grid[100][100]; // 宿舍区状态
bool visited[100][100] = {false}; // 访问标记
queue<Node> q; // 存储感染者的队列
// 输入宿舍区状态
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> grid[i][j];
if (grid[i][j] == '@') {
q.push({i, j, 0}); // 将初始感染者加入队列
visited[i][j] = true; // 标记为已访问
}
}
}
cin >> m;
// BFS 模拟流感传播
while (!q.empty()) {
Node current = q.front();
q.pop();
int x = current.x;
int y = current.y;
int day = current.day;
if (day >= m) {
continue; // 如果超过 m 天,跳过
}
// 检查四个邻居
for (int i = 0; i < 4; ++i) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < n && grid[nx][ny] == '.' && !visited[nx][ny]) {
visited[nx][ny] = true; // 标记为已感染
q.push({nx, ny, day + 1}); // 加入队列
}
}
}
// 统计感染人数
int count = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (visited[i][j]) {
count++;
}
}
}
cout << count << endl;
return 0;
}扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。