当前位置:首页 > 题解目录 > 正文内容

【题解】流感传染

亿万年的星光1个月前 (03-21)题解目录230

【题目描述】

有一批易感人群住在网格状的宿舍区内,宿舍区为n\*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。

【输入描述】

第一行一个数字n,n不超过100,表示有n*n的宿舍房间。

接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。

接下来的一行是一个整数m,m不超过100。

【输出描述】

输出第m天,得流感的人数。

【样例输入】

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

【样例输出】

16


【题目分析】

  1. 这种类型的输入是一个小问题,考虑getchar()

  2. 可以用三重循环,但是非常不建议。

  3. 当天感染的人不传染,第二天才传染。



【二维数组+三重循环】

#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;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

八皇后问题

八皇后问题

【题目描述】八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行...

【题解】东哥的杯子

【题解】东哥的杯子

【题目描述】话说在一场牛客练习赛中,东哥力压群雄,挣得第一,牛客为了奖励东哥的发挥,送他一个马克杯。奖励的马克杯是一个标准的圆台形状,它的上底为R1,下底为R2,高为H, 东哥向杯子里倒V毫升的水,你...

【题解】大数取模

【题目描述】求m%n。【输入描述】两个数,m和n。【输出描述】m模n的值。【样例输入】3【样例输出】2【数据范围】对于30%的数据, 1<m<10^18对于70%的数据, m>10^...

【题解】最大数问题

【题目描述】输入若干个整数。输出其中的最大数【输入描述】若干个整数。【输出描述】其中的最大数。【样例输入】1 2 5 7 8 6 1&nbs...

【题解】01串

【题目描述】Fans是个ACM程序设计迷。有时侯,他表现出很强烈的逆反心理,你往东,他往西,你往南,他偏往北。这一次,不知道又是谁惹着他了,好端端的一个个01串,到了他的手里,都变成10串了。请你编个...

小苹果(apple)

【题目描述】小 Y 的桌子上放着n个苹果从左到右排成一列,编号为从1到n。小苞是小 Y 的好朋友,每天她都会从中拿走一些苹果。每天在拿的时候,小苞都是从左侧第1个苹果开始、每隔2个苹果拿走2个苹果。随...