帮忙看看这个C++题目啦!!
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居...
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
关于输入
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100.
关于输出
输出第m天,得流感的人数
例子输入
5
....#
.#.@.
.#@..
#....
.....
4
例子输出
16
下面是我写的,为什么会错误呢?
#include<iostream>
using namespace std;
int main()
{
int n=0,i=0,j=0,m=0;
int flag=0;
cin>>n;
char flu[101][101];
for(i=1;i<=n;i++)
cin>>flu[i];
int k=0;
cin>>m;
for(k=1;k<=m;k++)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(flu[i][j]=='#')
;//continue;
else if(flu[i][j]=='.')
;//continue;
else if(flu[i][j]=='@')
{
if(flu[i+1][j+1]!='#')
{
flu[i+1][j+1]='@';
}
if(flu[i+1][j]!='#')
{
flu[i+1][j]='@';
}
if(flu[i-1][j-1]!='#')
{
flu[i-1][j-1]='@';
}
if(flu[i-1][j]!='#')
{
flu[i-1][j]='@';
}
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
//if(flu[i][j]=='@')
//flag++;
cout<<flu[i][j];
}
cout<<flag;
return 0;
} 展开
关于输入
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100.
关于输出
输出第m天,得流感的人数
例子输入
5
....#
.#.@.
.#@..
#....
.....
4
例子输出
16
下面是我写的,为什么会错误呢?
#include<iostream>
using namespace std;
int main()
{
int n=0,i=0,j=0,m=0;
int flag=0;
cin>>n;
char flu[101][101];
for(i=1;i<=n;i++)
cin>>flu[i];
int k=0;
cin>>m;
for(k=1;k<=m;k++)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(flu[i][j]=='#')
;//continue;
else if(flu[i][j]=='.')
;//continue;
else if(flu[i][j]=='@')
{
if(flu[i+1][j+1]!='#')
{
flu[i+1][j+1]='@';
}
if(flu[i+1][j]!='#')
{
flu[i+1][j]='@';
}
if(flu[i-1][j-1]!='#')
{
flu[i-1][j-1]='@';
}
if(flu[i-1][j]!='#')
{
flu[i-1][j]='@';
}
}
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
//if(flu[i][j]=='@')
//flag++;
cout<<flu[i][j];
}
cout<<flag;
return 0;
} 展开
2个回答
展开全部
你的程序除了"无上阳光2"说的这个错误外,还有一个就是你没判断数组下标是否已经越界,比如你的下标从1开始,你输入的值也是从1开始存储,但你判断的时候有i-1或者j-1的下标,这时候就会访问到下标为0的数组元素,而这些数组元素是未经赋值的,因此你所做的比较是不正确的。同样i+1或j+1的错误也是一样的道理。
我给你写了个简单的实现
主要思想:
1、每次对数组进行一次扫描,如果发现数组元素为'@',即为有病,则将此元素的上下左右邻居设置为被传染。这里有几个细节要注意:
a.下标判断-首先要判断数组下标在合法的范围内,我这里下标从0开始,因此范围为(0~n-1);
b.标记问题-若该数组元素为有病(值为'@'),不能简单的将其邻居也标记为'@',这就是“无上阳光2”说的那个问题,我采用的方法是将其邻居标记为'*',数组扫描完后,再扫描一次数组,将所有被标记为'*'的数组元素置为‘@’;另外,要对其邻居进行判断,若其也为‘@’,则不能将其标记为'*'了(否则,本来这个邻居的邻居应该被传染的,结果会变成未传染)。
#include<stdio.h>
#include<string.h>
int main()
{
int n,m,i,j;
char sickman[101][101];
printf("输入人数: ");
scanf("%d",&n);
memset(sickman,'#',sizeof(sickman)); //数组全部设为为'#',即无人住。不要这句也行
printf("输入字符数组:\n");
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{
scanf("%c", &sickman[i][j]);
if( '\n' == sickman[i][j] )
--j;
}
printf("输入m的值: ");
scanf("%d",&m);
while(--m > 0) //输入的数组已经是第一天的情况了,所以这里要设置为前自减
{
for( i = 0; i < n; i++)
for( j = 0; j < n; j++)
{
if(sickman[i][j] == '@')
{
if( i-1 >= 0 && sickman[i-1][j] == '.')
sickman[i-1][j] = '*';
if( i+1 < n && sickman[i+1][j] == '.')
sickman[i+1][j] = '*';
if( j-1 >= 0 && sickman[i][j-1] == '.')
sickman[i][j-1] = '*';
if( j+1 < n && sickman[i][j+1] == '.')
sickman[i][j+1] = '*';
}
}
for( i = 0; i < n; i++)
for( j = 0; j < n; j++)
if(sickman[i][j] == '*')
sickman[i][j] = '@';
}
int sum = 0;
for( i = 0; i < n; i++)
for( j = 0; j < n; j++)
if(sickman[i][j] == '@')
++sum;
printf("得流感的人数为: %d\n",sum);
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询