PTA 感染人数
7-1 感染人数
作者 黄龙军 单位 绍兴文理学院
设某住宿区域是一个n×n的方阵,方阵中的每个小方格为一个房间,房间里可能住一个人,也可能空着。第一天,某些房间中住着的人得了一种高传染性的流感,以后每一天,得流感的人会使其邻居(住在其上、下、左、右方向存在的房间里面的人)传染上流感,请问:第m天总共有多少人得流感?
输入格式:
第一行输入两个整数n,m(1<n≤20,1≤m≤100),含义如上述;接着输入n行,每行n个字符,表示住宿区域第一天的房间情况,其中,@
表示当天该房间住着得流感的人,.
表示该房间住着健康的人,#
表示该房间是空的。
输出格式:
输出一个整数,表示第m天得了流感的人数。
输入样例1:
5 3
#....
.....
...##
.#.@.
@.#..
输出样例1:
10
输入样例2:
5 4
....#
.#.@.
.#@..
#....
.....
输出样例2:
16
分析:
- 输入住宿人群的情况时要注意回车的输入
- 因为要求的是m天内总共感染的人数,第一天是给出的感染人数,所以循环天数要减1次。
- 因为所求天数m天内都会有新的人被感染,所以要将新感染的人和前一天/初始被感染的人区分开。所以给新感染人设置一个不同的符号(例如:‘1’或者其他都可以)。同时循环到当前房间时,它左边那一个和上面那一个当天已经遍历过了,就可以直接设置为‘@’,而右边和下面没有,先设置为‘1’,然后多加一个判断是不是‘1’,是就将其改为‘@’;或者把上下左右都改成‘1’,最后一起改成‘@’。
- 最后循环整个数组,计算出‘@’的个数就是感染的总人数
通过的代码:
#include<iostream> using namespace std; int main(){ int n,m; cin>>n>>m; char a[n][n]; cin.get(); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ a[i][j]=cin.get(); } cin.get(); } for(int k=1;k<m;k++){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(a[i][j]=='@'){ if(i>0&&a[i-1][j]=='.') a[i-1][j]='@'; if(i<n-1&&a[i+1][j]=='.') a[i+1][j]='1'; if(j>0&&a[i][j-1]=='.') a[i][j-1]='@'; if(j<n-1&&a[i][j+1]=='.') a[i][j+1]='1'; } if(a[i][j]=='1'){ a[i][j]='@'; } } } } int count=0; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(a[i][j]=='@') count++; } } cout<<count<<endl; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了