/*========================================================== 流感传染 总时间限制: 1000ms 内存限制: 65536kB 描述 有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。 输入 第一行一个数字n,n不超过100,表示有n*n的宿舍房间。 接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。 接下来的一行是一个整数m,m不超过100. 输出 输出第m天,得流感的人数 样例输入 5 ....# .#.@. .#@.. #.... ..... 4 样例输出 16 ============================================================*/ #include<stdio.h> #include<string.h> char a[100][100],b[100][100],n;//b数组是做为暂存中间结果的数组,以免今天刚感染的那些人对他周围的人马上也传染过去。 void fun(int i,int j);//使a[i][j]周围的人感染流感 int main() { int m,i,j,k,s; freopen("7.in","r",stdin); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s",a[i]); strncpy(b[i],a[i],n); } scanf("%d",&m); for(k=2;k<=m;k++) { for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(a[i][j]=='@')//这里是检测病人然后处理其周围的人。其实也可检测正常人然后看他周围是否有病人会传染给他。不过,其实道理都一样,也要存储中间结果。 { fun(i,j); } } } for(i=0;i<n;i++) { strncpy(a[i],b[i],n); } } s=0; for(i=0;i<n;i++) { /*printf("%s\n",a[i]);*/ for(j=0;j<n;j++) { if(a[i][j]=='@') { s++; } } } printf("%d\n",s); return 0; } void fun(int i,int j) { int x,y; x=i-1;y=j; if(x>=0&&a[x][y]=='.')//注意:这个地方的两个条件不能调整先后顺序,否则当x<0时先判断a[x][y]是否等于‘.’就错了,下标越界了。 { b[x][y]='@'; } x=i+1;y=j; if(x<n&&a[x][y]=='.')//注意:这个地方的两个条件不能调整先后顺序,否则当x>=n时先判断a[x][y]是否等于‘.’就错了,下标越界了。 { b[x][y]='@'; } x=i;y=j-1; if(y>=0&&a[x][y]=='.')//注意:这个地方的两个条件不能调整先后顺序,否则当y<0时先判断a[x][y]是否等于‘.’就错了,下标越界了。 { b[x][y]='@'; } x=i;y=j+1; if(y<n&&a[x][y]=='.')//注意:这个地方的两个条件不能调整先后顺序,否则当y>=n时先判断a[x][y]是否等于‘.’就错了,下标越界了。 { b[x][y]='@'; } }
下面是另外一个方法,可以把新感染的人标记为其他符号,这样就免掉了另外一个数组,可以省一点空间。
1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 int main() 5 { 6 char a[100][100]; 7 int i,n,j,d,m,sum=0; 8 freopen("5.in","r",stdin); 9 //freopen("result.out","w",stdout); 10 cin>>n; 11 for(i=0;i<n;i++) 12 { 13 for(j=0;j<n;j++) 14 { 15 cin>>a[i][j]; 16 } 17 } 18 cin>>m; 19 /*调试性输出 20 for(i=0;i<n;i++) 21 { 22 for(j=0;j<n;j++) 23 { 24 cout<<a[i][j]; 25 } 26 cout<<endl; 27 }*/ 28 29 for(d=2;d<=m;d++) 30 { 31 for(i=0;i<n;i++) 32 { 33 for(j=0;j<n;j++) 34 { 35 if(a[i][j]=='@') 36 { 37 if(i+1<n&&a[i+1][j]=='.') 38 a[i+1][j]='!'; 39 if(j-1>=0&&a[i][j-1]=='.') 40 a[i][j-1]='!'; 41 if(j+1<n&&a[i][j+1]=='.') 42 a[i][j+1]='!'; 43 if(i-1>=0&&a[i-1][j]=='.') 44 a[i-1][j]='!'; 45 } 46 } 47 } 48 /*调试性输出 49 cout<<endl<<"===========第"<<d<<"天================"<<endl; 50 for(i=0;i<n;i++) 51 { 52 for(j=0;j<n;j++) 53 { 54 cout<<a[i][j]; 55 } 56 cout<<endl; 57 }*/ 58 for(i=0;i<n;i++) 59 { 60 for(j=0;j<n;j++) 61 { 62 if(a[i][j]=='!') 63 a[i][j]='@'; 64 } 65 } 66 } 67 sum=0; 68 for(i=0;i<n;i++) 69 { 70 for(j=0;j<n;j++) 71 { 72 if(a[i][j]=='@') 73 sum++; 74 } 75 } 76 cout<<sum<<endl; 77 return 0; 78 }
简陋的递归:
1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 5 char a[100][100]; 6 int n,m; 7 8 void fun(int k);//表示当前根据第k-1天的结果计算第k天的数据 9 10 int main() 11 { 12 int i,j,d,sum=0; 13 //freopen("data.in","r",stdin); 14 cin>>n; 15 for(i=0;i<n;i++) 16 { 17 for(j=0;j<n;j++) 18 { 19 cin>>a[i][j]; 20 } 21 } 22 cin>>m; 23 /*调试性输出 24 for(i=0;i<n;i++) 25 { 26 for(j=0;j<n;j++) 27 { 28 cout<<a[i][j]; 29 } 30 cout<<endl; 31 }*/ 32 fun(2); 33 sum=0; 34 for(i=0;i<n;i++) 35 { 36 for(j=0;j<n;j++) 37 { 38 if(a[i][j]=='@') 39 sum++; 40 } 41 } 42 cout<<sum<<endl; 43 return 0; 44 } 45 void fun(int k)//表示当前根据第k-1天的结果计算第k天的数据 46 { 47 int i,j; 48 if(k>m) return; 49 else 50 { 51 for(i=0;i<n;i++) 52 { 53 for(j=0;j<n;j++) 54 { 55 if(a[i][j]=='@') 56 { 57 if(i+1<n&&a[i+1][j]=='.') a[i+1][j]='!'; 58 if(j-1>=0&&a[i][j-1]=='.') a[i][j-1]='!'; 59 if(j+1<n&&a[i][j+1]=='.') a[i][j+1]='!'; 60 if(i-1>=0&&a[i-1][j]=='.') a[i-1][j]='!'; 61 } 62 } 63 } 64 65 for(i=0;i<n;i++) 66 { 67 for(j=0;j<n;j++) 68 { 69 if(a[i][j]=='!') 70 a[i][j]='@'; 71 } 72 } 73 /*printf("\n----------------------------------\n"); 74 for(i=0;i<n;i++) 75 { 76 for(j=0;j<n;j++) 77 { 78 cout<<a[i][j]; 79 } 80 cout<<endl; 81 }*/ 82 fun(k+1); 83 } 84 }