2014-11-02 70 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