你的程序除了"无上阳光2"说的这个错误外,还有一个就是你没判断数组下标是否已经越界,比如你的下标从1开始,你输入的值也是从1开始存储,但你判断的时候有i-1或者j-1的下标,这时候就会访问到下标为0的数组元素,而这些数组元素是未经赋值的,因此你所做的比较是不正确的。同样i+1或j+1的错误也是一样的道理。
我给你写了个简单的实现
主要思想:
1、每次对数组进行一次扫描,如果发现数组元素为'@',即为有病,则将此元素的上下左右邻居设置为被传染。这里有几个细节要注意:
a.下标判断-首先要判断数组下标在合法的范围内,我这里下标从0开始,因此范围为(0~n-1);
b.标记问题-若该数组元素为有病(值为'@'),不能简单的将其邻居也标记为'@',这就是“无上阳光2”说的那个问题,我采用的方法是将其邻居标记为'*',数组扫描完后,再扫描一次数组,将所有被标记为'*'的数组元素置为‘@’;另外,要对其邻居进行判断,若其也为‘@’,则不能将其标记为'*'了(否则,本来这个邻居的邻居应该被传染的,结果会变成未传染)。
#include
#include
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;
}
当然是错的。。这么说吧,错误的地方在于你每天在更新的时候,更新的范围不对。。比方说开始的时候吧,(1,1)房间有病,但是(1,2)没病,你开始的时候就把(1,2)弄成有病的了,同一天的时候接下来你就扫描(1,2)去了,发现这个有病于是你就更新了(1,3).。。。明白吗。。。