2016-09-22 159 views
0

我試圖編寫一個代碼來解決迷宮問題中的老鼠。 '1'表示牆壁,'0'表示自由路徑。所有采用的路徑都存儲在二維數組路徑[200] [2]中。還可以通過用'*'替換路徑字符來打印路徑解決方案。另外,我正在用'1'取代已經採用的路徑,以便我們不再遵循該路徑。解決迷宮問題並在C中打印正確路徑

我的代碼:

#include<stdio.h> 

int main() 
{ 
char maze[10][10],mazeO[10][10]; 
int path[200][2],count=-1,N,M,cx,cy,sx,sy,ex,ey; 

printf("\nEnter the maze limit(Max=10): (M & N)"); 
    scanf("%d%d",&M,&N); 

    printf("\nEnter the maze:\n"); 

    for(int i=0;i<M;++i) { 
     for(int j=0;j<N;++j) 
     { 
       scanf(" %c",&maze[i][j]); 
       mazeO[i][j]=maze[i][j]; 
     } 
    } 
    printf("\nEnter the source cordinates(sx,sy):"); 
    scanf("%d%d",&sx,&sy); 

    printf("\nEnter the target cordinates(ex,ey):"); 
    scanf("%d%d",&ex,&ey); 

    cx=sx;cy=sy; 
    while(cx!=ex || cy!=ey) 
    { 
     if(maze[cx][cy+1]=='0'&&(cy+1)<N) 
     { 
      maze[cx][cy] = '1'; 
      count++; 
      path[count][0]=cx; 
      path[count][1]=cy; 

      cy=cy+1; 
     } 
     else if(maze[cx-1][cy]=='0'&&(cx-1)>0) 
     { 
      maze[cx][cy] = '1'; 
      count++; 
      path[count][0]=cx; 
      path[count][1]=cy; 

      cx=cx-1; 
     } 
     else if(maze[cx][cy-1]=='0'&&(cy-1)>0) 
     { 
      maze[cx][cy] = '1'; 
      count++; 
      path[count][0]=cx; 
      path[count][1]=cy; 

      cy=cy-1; 
     } 
     else if(maze[cx+1][cy]=='0'&&(cx+1)<M) 
     { 
      maze[cx][cy] = '1'; 
      count++; 
      path[count][0]=cx; 
      path[count][1]=cy; 

      cx=cx+1; 
     } 
     else 
     { 
      cx=path[count][0]; 
      cy=path[count][1]; 
      count--;  
     } 
    } 

    for(int i=0;i<=count;i++) 
     mazeO[path[i][0]][path[i][1]]='*'; 

    mazeO[ex][ey]='*'; 

    for(int i=0;i<M;++i) 
    { 

     for(int j=0;j<N;++j) 
     { 
      printf(" %c",mazeO[i][j]); 
     } 
     printf("\n"); 
    } 
} 

當我試圖運行具有以下輸入以上代碼:

M = 6 N = 7 
sx = 1 sy = 0 
ex = 4 ey = 6 

給定的輸入迷宮:

1 1 1 1 1 1 1 
0 0 0 0 0 1 1 
1 1 0 1 1 1 1 
0 0 0 1 1 1 1 
1 1 0 0 0 0 0 
1 1 1 1 1 1 1 

我得到一個在Ubuntu中的分割錯誤。我無法找到我做錯的地方。爲什麼我得到這個分段錯誤?

編輯:

我已經根據意見建議編輯代碼:

#include<stdio.h> 

int main() 
{ 
char maze[10][10],mazeO[10][10]; 
int path[200][2],count=-1,N,M,cx,cy,sx,sy,ex,ey; 

printf("\nEnter the maze limit(Max=10): (M & N)"); 
    scanf("%d%d",&M,&N); 

    printf("\nEnter the maze:\n"); 

    for(int i=0;i<M;++i) { 
     for(int j=0;j<N;++j) 
     { 
       scanf(" %c",&maze[i][j]); 
       mazeO[i][j]=maze[i][j]; 
     } 
    } 
    printf("\nEnter the source cordinates(sx,sy):"); 
    scanf("%d%d",&sx,&sy); 

    printf("\nEnter the target cordinates(ex,ey):"); 
    scanf("%d%d",&ex,&ey); 

    cx=sx;cy=sy; 
    while(cx!=ex || cy!=ey) 
    { 
     if((cy+1)<N && maze[cx][cy+1]=='0') 
     { 
      maze[cx][cy] = '1'; 
      count++; 
      path[count][0]=cx; 
      path[count][1]=cy; 

      cy=cy+1; 
     } 
     else if((cx-1)>0 && maze[cx-1][cy]=='0') 
     { 
      maze[cx][cy] = '1'; 
      count++; 
      path[count][0]=cx; 
      path[count][1]=cy; 

      cx=cx-1; 
     } 
     else if((cy-1)>0 && maze[cx][cy-1]=='0') 
     { 
      maze[cx][cy] = '1'; 
      count++; 
      path[count][0]=cx; 
      path[count][1]=cy; 

      cy=cy-1; 
     } 
     else if((cx+1)<M && maze[cx+1][cy]=='0') 
     { 
      maze[cx][cy] = '1'; 
      count++; 
      path[count][0]=cx; 
      path[count][1]=cy; 

      cx=cx+1; 
     } 
     else 
     { 
      cx=path[count][0]; 
      cy=path[count][1]; 

      count--;  
     } 
    } 

    for(int i=0;i<=count;i++) 
     mazeO[path[i][0]][path[i][1]]='*'; 

    mazeO[ex][ey]='*'; 

    for(int i=0;i<M;++i) 
    { 

     for(int j=0;j<N;++j) 
     { 
      printf(" %c",mazeO[i][j]); 
     } 
     printf("\n"); 
    } 
} 

仍然是分段故障發生。我在Windows操作系統上嘗試了它,並且在Windows中它沒有給出任何錯誤,但它沒有打印正確的路徑迷宮。

FINAL工作液:

所有我需要的是的其他循環中。還將if循環條件(cy-1)>0更改爲(cy-1)>=0(cx-1)>0(cx-1)>=0。還包括在if(count>=0)循環內的count--

+0

它是必不可少的,以檢查是否數組的索引是有效* *前你在那個索引處檢查它的內容。 –

+0

您是否知道在使用它之前您必須初始化一個數組? – MrPaulch

+0

如果您在回溯時遇到'count <0'的情況,您需要處理它 - 否則如果沒有目標路徑,您的代碼將會爆炸(或其他)。這可能不是你的直接問題的原因,但。 –

回答

0

正如@ Klas-Lindbäck已經提到的那樣,你不會把數量變成負數。然後它會在數組外面開始索引path [],併發生不好的事情。

找不到路徑的原因是因爲(5,6)是牆。也許你的意思是(4,6)?

另外,左列和上排不允許訪問是因爲你檢查(CY-1)> 0,而不是> = 0

除此之外您的回溯步驟需要設置迷宮[CX ] [cy]設爲1以防止一遍又一遍地進入相同的路徑。

+0

在更新的代碼中,我將每個if語句中的迷宮[cx] [cy]更改爲'1'。是的,它應該是(4,6)而不是(5,6) –

0

許多問題:

  1. 所有if S中同時內部進行檢查maze[cx][cy]而迷宮數據存儲到mazeO矩陣。或者,也許雙循環應該填寫maze而不是mazeO
  2. 您的出口座標指向牆壁,因此無法退出。
  3. 您的代碼無法「選擇」移動方向。因此,從您的參數開始,「玩家」在位置34之間的線路1上連續乒乓(向左和向右移動)。
  4. 後200乒乓在點3 count描述將針對你的路徑矩陣outof綁定所以Undefined Behavior你的情況是段故障