分段错误(核心转储)。具有更改条目的2D阵列

时间:2014-11-02 23:12:44

标签: c

我正在开发一个程序,它将找到从机器人到出口的最短路径。机器人将在2d阵列上垂直和水平移动。将有10个阻碍机器人运动的块。出口始终位于0x7,机器人和块的位置是随机创建的。

我正在寻找最短路径的方法是找到机器人的位置,然后在左右,上下各个可能的位置放置1。然后找到1,并向右,向左,向上和向下放2。然后通过找到2再次,向右和向左,向上和向下放3。我会这样做,直到填满矩阵。

然后,最短路径将从机器人到退出,然后按数字递增顺序。所以,我认为我完成了大部分程序。

我的问题与用1,2,3,4.etc填充矩阵的函数有关。我得到了分段错误,我假设,在做了一些研究后,错误是因为我使用的是我无法访问的内存。如果是这种情况,我认为问题是我填充矩阵的功能。你能帮我发现我的功能有什么问题吗?我包括我迄今为止为我的程序所写的内容。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main() {
  int A[8][8],num=0;
  char B[8][8];
  char C[64];
  char D[64];

  intmatrix(A);
  charmatrix(B);
  matrixini(B,A);

  while(num<64) {
    matrix_find_fill(A,num);
    num++;
  }

  printmatrix(B,A);

  return 0;
}


int printmatrix(char B[8][8], int A[8][8]) {
  int i, j;
  for(i=0;i<8;i++) {
    for(j=0;j<8;j++) {
      printf("%c ",B[i][j]);
    }
    printf("\n");
  }
  for(i=0;i<8;i++) {
    for(j=0;j<8;j++) {
      printf("%i ",A[i][j]);
    }
    printf("\n");
  }
  return 0;
}

int charmatrix(char B[8][8]) {
  int i,j;
  for(i=0;i<8;i++) {
    for(j=0;j<8;j++) {
      B[i][j]=' ';
    }
  }
  return 0;
}

int intmatrix(int A[8][8]) {
  int i,j;
  for(i=0;i<8;i++) {
    for(j=0;j<8;j++) {
      A[i][j]=-1;
    }
  }
  return 0;
}

int matrixini(char B[8][8], int A[8][8]) {
  int r,c,a,b,n=0;
  srand((unsigned int)time(NULL) );
  a=rand()%9;
  b=rand()%9;
  B[a][b]='R';
  A[a][b]=0;
  B[0][7]='E';
  A[0][7]=99;
  do{
    r=rand()%8;
    c=rand()%8;
    if (B[r][c]==' ') {
      B[r][c]='#';
      A[r][c]=-2;
      n++;
    }
  } while(n<10);
  if ((B[0][6]=='#') && (B[1][7]=='#')) {
    printf("The Robot wont be able to exit.Game over!\n");
    exit(0);
  }
  return 0;
}

int matrix_find_fill(int A[8][8],int num) {
  int i,j;
  for(i=0;i<8;i++) {
    for(j=0;j<8;j++) {
      if(A[i][j]==num) {
        if(i==0) {
          if((j>=0) && (j<=7)) {
            if(j==0) {
              if(A[i+1][j]==-1) {
                A[i+1][j]=num+1;
              }
              if(A[i][j+1]==-1) {
                A[i][j+1]=num+1;
              }
            }
            if((j>0) && (j<7)) {
              if(A[i][j-1]==-1) {
                A[i][j-1]=num+1;
              }
              if(A[i][j+1]==-1) {
                A[i][j+1]=num+1;
              }
              if(A[i-1][j]==-1) {
                A[i-1][j]=num+1;
              }
            }
            if(j==7) {
              if(A[i+1][j]==-1) {
                A[i+1][j]=num+1;
              }
              if(A[i][j-1]==-1) {
                A[i][j-1]=num+1;
              }
            }
          }
          if((j<7) && (A[i][j+1]==-1)) {
            A[i][j+1]=num+1;
          }
        }
        if((i>0) && (i<7)) {
          if((j>=0) && (j<=7)) {
            if(j==0) {
              if(A[i+1][j]==-1) {
                A[i+1][j]=num+1;
              }
              if(A[i][j+1]==-1) {
                A[i][j+1]=num+1;
              }
              if(A[i-1][j]==-1) {
                A[i-1][j]=num+1;
              }
            }
            if((j>0) && (j<7)) {
              if(A[i][j-1]==-1) {
                A[i][j-1]=num+1;
              }
              if(A[i][j+1]==-1) {
                A[i][j+1]=num+1;
              }
              if(A[i-1][j]==-1) {
                A[i-1][j]=num+1;
              }
              if(A[i+1][j]==-1) {
                A[i+1][j]=num+1;
              }
            }
            if(j==7) {
              if(A[i+1][j]==-1) {
                A[i+1][j]=num+1;
              }
              if(A[i][j-1]==-1) {
                A[i][j-1]=num+1;
              }
              if(A[i-1][j]==-1) {
                A[i-1][j]=num+1;
              }
            }
          }
          if((j<7) && (A[i][j+1]==-1)) {
            A[i][j+1]=num+1;
          }
        }
        if(i==7) {
          if((j>=0) && (j<=7)) {
            if(j==0) {
              if(A[i-1][j]==-1) {
                A[i-1][j]=num+1;
              }
              if(A[i][j+1]==-1) {
                A[i][j+1]=num+1;
              }
            }
            if((j>0) && (j<7)) {
              if(A[i][j-1]==-1) {
                A[i][j-1]=num+1;
              }
              if(A[i][j+1]==-1) {
                A[i][j+1]=num+1;
              }
              if(A[i-1][j]==-1) {
                A[i-1][j]=num+1;
              }
            }
            if(j==7) {
              if(A[i-1][j]==-1) {
                A[i-1][j]=num+1;
              }
              if(A[i][j-1]==-1) {
                A[i][j-1]=num+1;
              }
            }
          }
          if((j<7) && (A[i][j+1]==-1)) {
            A[i][j+1]=num+1;
          }
        }
      }
    }
  }
  return 0;
}

1 个答案:

答案 0 :(得分:1)

a = rand() % 9中的

matrixini()可能会出现在8,这超出了界限。与b = rand() % 9相同。

您可能希望将这些内容更改为a = rand() % 8b = rand() % 8

考虑到代码的长度和棘手,您应该将matrix_find_fill()函数重构为更简单的格式。

以下是另一种方法:

int di[] = {0, 0, 1, -1};
int dj[] = {-1, 1, 0, 0};

int matrix_find_fill(int A[8][8], int num) {
  int i, j, k, ni, nj;
  for(i = 0; i < 8; i++) for(j = 0; j < 8; j++) {
    if(A[i][j] == num) {
      for(k = 0; k < 4; k++) {
        ni = i + di[k];
        nj = j + dj[k];
        if(ni >= 0 && nj >= 0 && ni < 8 && nj < 8 && A[ni][nj] == -1) {
          A[ni][nj] = num + 1;
        }
      }
    }
  }
}

说明:

对于满足(i, j)的每个职位A[i][j] = num,我们使用didj来计算(i, j)中可能的相邻单元格。从本质上讲,ninj涵盖了所有这些案例:(i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1)

然后,if语句检查ninj是否都在入境中。如果A[ni][nj]当前为num + 1,我们会将-1更新为{{1}}。

但是,您应该注意,您应该利用有效的最短路径算法,其中一些是:

另外,我希望你在编写整个程序后没有开始测试代码 - 这几乎总是会导致痛苦的错误。