top1编程
← 返回题目
题解

流感传染

1 条题解

  • 0
    @ 2026-7-28 22:45:07
    #include<bits/stdc++.h> 
    using namespace std;  
    long long n, m, c;          // n: 宿舍区的大小, m: 天数, c: 感染人数计数  
    long long a[999][999];      // 状态矩阵,最大大小999x999  
    char a1;                    // 临时变量,用于输入每个房间的状态  
    
    int main() {  
        cin >> n; // 输入宿舍区的规模  
        for (int i = 1; i <= n; i++) {  
            for (int j = 1; j <= n; j++) {  
                cin >> a1; // 读取每个房间的状态  
                if (a1 == '#') {  
                    a[i][j] = 0; // 空房间  
                }  
                if (a1 == '@') {  
                    a[i][j] = 2; // 第一天的病人  
                }  
                if (a1 == '.') {  
                    a[i][j] = 1; // 健康人  
                }  
            }  
        }  
        cin >> m; // 输入感染的天数  
    
        // 从第二天开始遍历直到第m天  
        for (int i = 2; i <= m; i++) {  
            // 检查每个房间  
            for (int j = 1; j <= n; j++) {  
                for (int k = 1; k <= n; k++) {  
                    if (a[j][k] == 2) { // 如果当前房间是感染者  
                        // 检查四个方向的邻居  
                        if (a[j-1][k] == 1) {  
                            a[j-1][k] = 3; // 上邻居变为标记的健康人  
                        }  
                        if (a[j][k+1] == 1) {  
                            a[j][k+1] = 3; // 右邻居变为标记的健康人  
                        }  
                        if (a[j+1][k] == 1) {  
                            a[j+1][k] = 3; // 下邻居变为标记的健康人  
                        }  
                        if (a[j][k-1] == 1) {  
                            a[j][k-1] = 3; // 左邻居变为标记的健康人  
                        }  
                    }  
                }  
            }  
            // 更新状态,将所有被标记的健康人转为感染者  
            for (int j = 1; j <= n; j++) {  
                for (int k = 1; k <= n; k++) {  
                    if (a[j][k] == 3) {  
                        a[j][k] = 2; // 更新成感染者  
                    }  
                }  
            }  
        }  
        
        // 统计感染人数  
        for (int i = 1; i <= n; i++) {  
            for (int j = 1; j <= n; j++) {  
                if (a[i][j] == 2) {  
                    c++; // 感染人数加1  
                }  
            }  
        }  
        
        cout << c; // 输出总感染人数  
        return 0;  
    }
    
    • 1