7-4 感染 (25 分) C++快速解决感染问题,思想直接,注释明了

7-4 感染 (25 分) PTA

7-4 感染 (25 分)
新冠疫情爆发,Drizzle 想知道假如在一个区域内分布着正常人和感染者,感染者每天会感染附近(上下左右)的正常人,多少天内所有人都被感染,求出最少天数days,如果不会被全部感染则输出victory。

要求:
输入:第一行输入两个整数m,n表示地图区域的行列,随后的m行输入n个数字表示地图中的人员布局(0表示没人,1表示正常人,2表示感染者)。
输出:假如所有人被感染输出全部人员都被感染的天数num,否则输出victory。

示例:
输入:

3 3
2 1 1
1 1 0
0 1 1
输出:

4

思想

主要是如何感染,以及如何退出感染的循环
我在代码中设立了 几个变量 flag  大家可以自习看一下
怎么设置感染呢?
首先,横向扫描,能够感染的话建立一个数组标记一下,
然后纵向扫描,能够感染的话在标记一下;
最终在统计刷新次数后,需要把那些可以感染统统感染。
然后继续循环,知道没有人被感染,做好标记,跳出循环就
可以了!
*大家有什么问题可以私聊我,或者评论区发言,最好是评论区哦
大家可以一起讨论哦!*
#include<iostream>
using namespace std;
int main(){
	
	//   循环判断是否全部感染了  如果是 那么就跳出循环     如果没有 循环继续,感染别的人 知道没有人可以被感染 这里需要
	 //   需要做一个标记  来记录 啥时候没有可以被感染的了 
	 
	 //  判断 的 时候不可以超过边界
	 
	 // 上下左右 的边界 情况 
	  
		int flag = 1; //判断是否被改变 
		int flag_ren = 0;
	  	int m,n;
		
		cin>> m >> n;
		
		int Map[m][n];
		
		for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
				cin>>Map[i][j];
			}
		}
		
		int num = 0;
		int pp[m][n]={0};
		while(1){
			
			flag = 1;	//每次都重头标记一下 
			for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
					 //先给横向扫描一遍 
				if(Map[i][j]==2){
					
					if( (j-1)>=0 ){
						// 判断前后 可以感染的 都给感染了 
						if( Map[i][j-1] == 1 ){
							pp[i][j-1] = 1; 
							flag = 0;
						}
						
						
						}
						
					if( (j+1)<n ){
						
						if( Map[i][j+1] == 1 ){
							pp[i][j+1] = 1; 
							flag = 0;
					}
						
					}
					
				}
			
			
			}
		}
		
		
			for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
					 //纵向扫描一遍 
				if(Map[i][j]==2){
					
					if( (i-1)>=0 ){
						// 判断上下 可以感染的 都给感染了 
						if( Map[i-1][j] == 1 ){
							pp[i-1][j] = 1; 
							flag = 0;
						}
						
						
					}
					if( (i+1)<m ){
						if( Map[i+1][j] == 1 ){
							pp[i+1][j] = 1; 
							flag = 0;
						}
					}
					
				}
			
			
			}
		}
		
		 
			for(int i=0;i<m;i++){   
			for(int j=0;j<n;j++){
					 
				if(pp[i][j]==1){
					Map[i][j] = 2;
				}
			
			}
		
		}
		
	
		
			num++; //天数++
		
			if(flag == 1)
			{
				//没有被感染的了num得减减 
				num--;
				break; //跳出循环然后统计 
			}

					/*测试*/ 	
			
//			cout<<endl;
//			
//			for(int i=0;i<m;i++){   
//			for(int j=0;j<n;j++){
//					 
//				cout<<Map[i][j]<<" ";
//			
//			}
//			cout<<endl;
//		}
		
					
		}
			
				for(int i=0;i<m;i++){  //判断是否全部被感染 
			for(int j=0;j<n;j++){
					 
				if(Map[i][j] == 1){
					
					flag_ren = 1;
					
				}
			
			
			}
		}
		
		int flag_0 = 0;
		
			for(int i=0;i<m;i++){  //判断是否全部都是0 如果全都是 那么还是 胜利  
			for(int j=0;j<n;j++){
					 
				if(Map[i][j] != 0){
					
					flag_0 = 1;
					
				}
			
			
			}
		}
		if(flag_0 == 0){
			flag_ren = 1;
		}
		
			
			if( flag_ren == 1 ){
				cout<<"victory"<<endl;
			
			}else cout<<num;
			
			
			
			/*测试*/ 	
		
//			cout<<endl;
//			
//			for(int i=0;i<m;i++){   
//			for(int j=0;j<n;j++){
//					 
//				cout<<Map[i][j]<<" ";
//			
//			}
//			cout<<endl;
//		}
			

	
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值