/*==========================================================
流感传染
总时间限制: 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 }