原题链接:流感传染
解题思路:
两种方法,也是两种思路,第一种,每一天遍历地图一遍,如果当前格子没有被感染,就看它上下左右是否有感染源,今天是否会被感染,被感染则标记@。
第二种方法,使用队列进行bfs搜索,将每一天的感染源加入队列,向上下左右进行感染扩散,直到没有病人被感染和到达规定天数。
一个是看健康的人是否会被感染,一个是感染源进行扩散。
注意:问题是输入第m天被感染的人数,所以只感染了m-1天。
第一种方法代码:
#include <bits/stdc++.h> using namespace std; int dx[4]= {-1,1,0,0}; //上 下 左 右 int dy[4]= {0,0,-1,1}; char dp[107][107],sp[107][107];//sp数组用来存放当天感染前的情况 int main () { int n,m,z=0; cin>>n; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { cin>>dp[i][j]; sp[i][j]=dp[i][j]; } } cin>>m; m--;//注意,只感染了m-1天,所以要进行-1 while(m--) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) {//遍历地图 if(sp[i][j]=='.') {//如果是健康的人 for(int k=0; k<4; k++) {//四个方向进行搜索 int x=i+dx[k],y=j+dy[k]; if(x>0&&x<=n&&y>0&&y<=n) {//如果没有超出地图 if(sp[x][y]=='@') {//注意这里是sp数组,当天感染前周围有病人 dp[i][j]='@';//则被感染 break; } } } } } } for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { sp[i][j]=dp[i][j];//将这一天的感染情况赋值给sp数组 // cout<<dp[i][j]<<" \n"[j==n];//打印看每一天的感染情况 } } } for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(dp[i][j]=='@')z++;//计算感染人数 } } cout<<z; return 0; }
这里有一个细节,需要记录下当天开始感染前的地图,不然遍历到后面的时候搜索到的感染源是今天新增的,也会被感染。
第二种方法:
#include <bits/stdc++.h> using namespace std; struct node { int x,y,l;//l表示天数 }; queue<node>q; int dx[4] = {-1,1,0,0}; //上 下 左 右 int dy[4] = {0,0,-1,1}; char dp[107][107]; int z = 0;//记录被感染的人数 void bfs(int n,int m) { while(!q.empty()) {//如果队列不为空 node now = q.front();//取出队首的感染源 q.pop();//队首出列 if(now.l>=m)break;//如果天数大于等于m,即为结束,因为是第m天,所以有等号 for(int i=0; i<4; i++) {//四个方向搜索 int x=now.x+dx[i],y=now.y+dy[i]; if(x>0&&x<=n&&y>0&&y<=n) {//不超过地图 if(dp[x][y]=='.') {//周围是健康的人 dp[x][y]='@'; z++;//感染人数+1 node n;//将这个人也记为感染源 n.x = x; n.y = y; n.l = now.l+1;//注意天数+1 q.push(n);//加入到队列中 } } } } } int main () { int n,m; cin>>n; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { cin>>dp[i][j]; if(dp[i][j]=='@') { z++; node n;//地图中初始的感染源加入到队列中 n.x = i; n.y = j; n.l = 1;//为第一天 q.push(n); } } } cin>>m; bfs(n,m); cout<<z; return 0; }
相比之下还是bfs比较简单,需要思考的也少。
以上。
0.0分
6 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复