帮忙看看这个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;
}
展开
 我来答
skks413
推荐于2016-11-12 · 超过20用户采纳过TA的回答
知道答主
回答量:50
采纳率:0%
帮助的人:55.5万
展开全部

你的程序除了"无上阳光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;
}
无上阳光2
2013-11-08 · TA获得超过257个赞
知道小有建树答主
回答量:213
采纳率:0%
帮助的人:167万
展开全部
当然是错的。。这么说吧,错误的地方在于你每天在更新的时候,更新的范围不对。。比方说开始的时候吧,(1,1)房间有病,但是(1,2)没病,你开始的时候就把(1,2)弄成有病的了,同一天的时候接下来你就扫描(1,2)去了,发现这个有病于是你就更新了(1,3).。。。明白吗。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式