2014-11-02 40 views
-1

我正在研究一个程序,该程序可以找到从机器人到出口的最短路径。机器人将在二维阵列上垂直和水平移动。将会有10块阻碍机器人的移动。出口总是位于0x7,机器人和块的位置是随机创建的。分段错误(核心转储)。具有更改条目的2D阵列

我正在寻找最短路径的方法是找到机器人的位置,然后将每个可能的位置放在右,左,上和下。然后找到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; 
} 
+0

填充矩阵值时,作为找到出口的最短路径的一部分,必须从当前方向对每个方向进行检查,以避免写入矩阵之外。 I.E.函数matrix_find_fill()需要重新设计。 – user3629249 2014-11-03 01:33:03

回答

1

a = rand() % 9matrixini()可能出来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; 
     } 
     } 
    } 
    } 
} 

说明:

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

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

但是,你要注意,有效率的最短路径算法,你应该充分利用,其中一些是:

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

+0

我刚刚做到了。我仍然得到同样的错误。 :( – dperez 2014-11-02 23:17:31

+0

我正在测试代码和写作,但填写数字的部分让我很困惑,我已经多次更改了该程序,感谢您的帮助,尽管如此 – dperez 2014-11-02 23:20:46

+0

if语句没有照顾到这一点吗?通过使用if语句,我是说在某些情况下可以这样做,对吗?谢谢 – dperez 2014-11-02 23:24:43