Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可能的原因是什么;异常程序终止“;C程序中的错误?_C_Algorithm - Fatal编程技术网

可能的原因是什么;异常程序终止“;C程序中的错误?

可能的原因是什么;异常程序终止“;C程序中的错误?,c,algorithm,C,Algorithm,下面的代码是通过在二维数组中将1视为孤岛,将0视为水来查找孤岛数。相邻的1属于同一个岛,岛可以是任何形状。表示 1 01 0110 1 01 应将孤岛数设为1。此代码运行并打印2 x 2矩阵的某些内容,但对任何高阶矩阵都显示“异常终止错误”。代码有何错误以及如何克服错误?我只是尝试递归地将相邻元素设为零,但最终出现了这个错误 #include <stdio.h> #include <conio.h> int a[10][10],m,n; int islands=0;

下面的代码是通过在二维数组中将1视为孤岛,将0视为水来查找孤岛数。相邻的1属于同一个岛,岛可以是任何形状。表示
1 01
0110
1 01
应将孤岛数设为1。此代码运行并打印2 x 2矩阵的某些内容,但对任何高阶矩阵都显示“异常终止错误”。代码有何错误以及如何克服错误?我只是尝试递归地将相邻元素设为零,但最终出现了这个错误

#include <stdio.h>
#include <conio.h>

int a[10][10],m,n;
int islands=0;

void MakeZero(int,int);

void main()
{
   int i,j;
   clrscr();
   printf("Enter the number of rows and columns :");
   scanf("%d%d",&m,&n);
   printf("Enter the matrix of 0s and 1s\n");
   for(i=0;i<m;i++){
      for(j=0;j<n;j++){
         scanf("%d",&a[i][j]);
      }
   }
   printf("Input Matrix is :\n");
   for(i=0;i<m;i++){
      for(j=0;j<n;j++){
         printf("%d ",a[i][j]);
      }printf("\n");
   }

   printf("The Number of Islands is :\n");
   for(i=0;i<m;i++){
      for(j=0;j<n;j++){
         if(a[i][j])
         {islands++;
            MakeZero(i,j); }
      }
   }
   printf("%d",islands);
   getch();
}

void MakeZero(int i,int j)
{
   if(i>m-1||j>n-1)
      return;
   else if(i==0&&j==0)
   {
      if(a[i][j+1]==1)MakeZero(i,j+1);
      if(a[i+1][j+1]==1)MakeZero(i+1,j+1);
      if(a[i+1][j]==1)MakeZero(i+1,j);
      a[i][j+1]=a[i+1][j+1]=a[i+1][j]=0;
   }
   else if(i==m-1&&j==0)
   {
      if(a[i-1][j]==1)MakeZero(i-1,j);
      if(a[i][j+1]==1)MakeZero(i,j+1);
      if(a[i-1][j+1]==1)MakeZero(i-1,j+1);
      a[i-1][j]=a[i][j+1]=a[i-1][j+1]=0;
   }
   else if(i==0&&j==n-1)
   {
      if(a[i][j-1]==1)MakeZero(i,j-1);
      if(a[i+1][j-1]==1)MakeZero(i+1,j-1);
      if(a[i+1][j]==1)MakeZero(i+1,j);
      a[i][j-1]=a[i+1][j-1]=a[i+1][j]=0;
   }
   else if(i==m-1&&j==n-1)
   {
      if(a[i][j-1]==1)MakeZero(i,j-1);
      if(a[i-1][j]==1)MakeZero(i-1,j);
      if(a[i-1][j-1]==1)MakeZero(i-1,j-1);
      a[i][j-1]=a[i-1][j]=a[i-1][j-1]=0;
   }
   else if(i==0&&(j>0&&j<n-1))
   {
      if(a[i][j-1]==1)MakeZero(i,j-1);
      if(a[i][j+1]==1)MakeZero(i,j+1);
      if(a[i+1][j-1]==1)MakeZero(i+1,j-1);
      if(a[i+1][j+1]==1)MakeZero(i+1,j+1);
      if(a[i+1][j]==1)MakeZero(i+1,j);
      a[i][j-1]=a[i][j+1]=a[i+1][j-1]=a[i+1][j+1]=a[i+1][j]=0;
   }
   else if(i==m-1&&(j>0&&j<n-1))
   {
      if(a[i][j-1]==1)MakeZero(i,j-1);
      if(a[i][j+1]==1)MakeZero(i,j+1);
      if(a[i-1][j-1]==1)MakeZero(i-1,j-1);
      if(a[i-1][j+1]==1)MakeZero(i-1,j+1);
      if(a[i-1][j]==1)MakeZero(i-1,j);
      a[i][j-1]=a[i][j+1]=a[i-1][j-1]=a[i-1][j+1]=a[i-1][j]=0;
   }
   else if(j==0&&(i>0&&i<m-1))
   {
      if(a[i-1][j]==1)MakeZero(i-1,j);
      if(a[i+1][j]==1)MakeZero(i+1,j);
      if(a[i-1][j+1]==1)MakeZero(i-1,j+1);
      if(a[i+1][j+1]==1)MakeZero(i+1,j+1);
      if(a[i][j+1]==1)MakeZero(i,j+1);
      a[i-1][j]=a[i+1][j]=a[i-1][j+1]=a[i+1][j+1]=a[i][j+1]=0;
   }
   else if(j==n-1&&(i>0&&i<m-1))
   {
      if(a[i-1][j]==1)MakeZero(i-1,j);
      if(a[i+1][j]==1)MakeZero(i+1,j);
      if(a[i-1][j-1]==1)MakeZero(i-1,j-1);
      if(a[i+1][j-1]==1)MakeZero(i+1,j-1);
      if(a[i][j-1]==1)MakeZero(i,j-1);
      a[i-1][j]=a[i+1][j]=a[i-1][j-1]=a[i+1][j-1]=a[i][j-1]=0;
   }
   else
   {
      if(a[i-1][j]==1)MakeZero(i-1,j);
      if(a[i+1][j]==1)MakeZero(i+1,j);
      if(a[i-1][j-1]==1)MakeZero(i-1,j-1);
      if(a[i+1][j-1]==1)MakeZero(i+1,j-1);
      if(a[i][j-1]==1)MakeZero(i,j-1);
      if(a[i][j+1]==1)MakeZero(i,j+1);
      if(a[i-1][j+1]==1)MakeZero(i-1,j+1);
      if(a[i+1][j+1]==1)MakeZero(i+1,j+1);
      a[i-1][j]=a[i+1][j]=a[i-1][j-1]=a[i+1][j-1]=a[i][j-1]=a[i][j+1]=a[i-1][j+1]=a[i+1][j+1]=0;
   }
}
#包括
#包括
int a[10][10],m,n;
int岛=0;
void MakeZero(int,int);
void main()
{
int i,j;
clrsc();
printf(“输入行数和列数:”);
scanf(“%d%d”,&m,&n);
printf(“输入0和1的矩阵\n”);

对于(i=0;i您的程序引发堆栈溢出,因为您的递归函数
MakeZero()
从未达到基本大小写。使用您提供的相同输入示例,只添加一个
printf(“%d%d\n”,i,j)
Makezero
的最后一个
else
条件下,程序将无限期地输出
11
,您将永远无法达到条件
(i>m-1 | j>n-1)
停止程序,因为
m-1
n-1
的值是
2
i=1
j=1
永久值


建议:尝试找出矩阵
a
中至少有一个值为
0
时发生的情况,因为堆栈溢出似乎只在这种情况下发生。

AsM Oehm已经说过问题在于将正方形标记为零的时间(或者说“已访问”)

当函数
MakeZero
在至少一个相邻的方格中找到一个包含一个的方格时,它会调用自身。由于在调用
MakeZero
后将该方格标记为
0
,因此,只要在函数中有两个相邻的方格包含
1
,就会导致堆栈溢出矩阵。由于第一个
MakeZero
找到相邻的
1
并调用
MakeZero
,这也会找到相邻的
1
并再次调用
MakeZero
。(如果从调试器中查看调用堆栈,可以看到这一点)

关于
MakeZero
实现的另一件事是:您在
MakeZero
中显式处理所有特殊情况,这使得代码非常冗长且更难理解。我建议修改该函数,仅检查输入值是否有效以及平方是否为1。如果是,请将值设置为零并调用
为所有相邻的正方形(无论矩阵中的当前位置如何)设置零。实现如下所示:

void MakeZero(int i, int j)
{
   int x, y;

   if ((i >= 0) && (i < m) &&   /* i index valid? */
       (j >= 0) && (j < n) &&   /* j index valid? */
       (a[i][j] == 1))          /* square is an island? */
   {
      a[i][j] = 0;   /* remove 1 from matrix !!! */

      /* iterate all surrounding squares */
      for (x = (i - 1); x <= (i + 1); x++)
      {
         for (y = (j - 1); y <= (j + 1); y++)
         {
            MakeZero(x, y);
         }
      }
   }
}
void MakeZero(inti,intj)
{
int x,y;
如果((i>=0)和((i=0)和(j对于(x=(i-1);x您是否尝试在调试器中运行它?想想您如何将正方形标记为零。您的方法就像走进labyrith并说:我会在回去的路上放下面包屑。堆栈溢出正在发生。'a[i-1][j]=a[i-1][j]=a[i-1][j-1]=a[i+1][j-1]=a[i][j-1]=a[i-1][j+1]=0'-当然,我正忙着为您调试:(