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