2016-09-22 26 views
0

私は迷路の問題でラットを解決するためのコードを作成しようとしています。 '1'は壁用、 '0'は自由経路用です。すべての経路は2D配列経路[200]に格納されます。パス文字を '*'に置き換えて、パス解を出力してください。また、私はもう一度そのパスに従わないように、すでに '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のセグメンテーションエラー。私はどこで間違ったのか分からない。このセグメンテーション違反が発生するのはなぜですか?

EDIT:

私はコメントで提案に応じてコードを編集した:

#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 OSでそれを試してみましたが、Windowsではエラーは出ませんが、正しいパスの迷路は表示されません。

FINAL作業溶液:

は、私は必要なすべては、他のループ内ました。また、ifループ条件(cy-1)>0(cy-1)>=0(cx-1)>0(cx-1)>=0に変更しました。また、if(count>=0)ループ内にcount--が含まれています。

+0

であることをあなたのパス行列に取り組むポイント3 countで説明した後、配列のインデックスが有効であるかどうかを確認することが不可欠である*前*そのインデックスでそのコンテンツをチェックします。 –

+0

アレイを使用する前に初期化する必要があることをご存知でしたか? – MrPaulch

+0

バックトラックするときに 'count <0'というケースが発生した場合、それを処理する必要があります。そうしないと、ターゲットへのパスがない場合にコードが爆発します。しかし、これはおそらくあなたの直接の問題の原因ではありません。 –

答えて

0

@ Klas-Lindbäckは既に述べたように、カウントが負になるのを処理しません。その後、配列の外側にpath []のインデックスが作成され、悪いことが起こります。

パスが見つからない理由は、(5,6)が壁であるためです。多分あなたは(4,6)を意味するでしょうか?

また、左列上段はかわり> =離れて自分のバックトラック工程が迷路を設定する必要があることから

0 [CXの(CY-1)> 0をチェックするためにアクセスすることを許可されていません] [cy]を1に設定して、同じパスを繰り返し入力することを防ぎます。

+0

更新されたコードでは、各if文の中で迷路[cx] [cy]を '1'に変更しています。そして、それは(5,6)の代わりに(4,6) –

0

多くの問題:

  1. 全てif Sながらチェックmaze[cx][cy]内部迷路データはmazeO行列に格納されています。あるいは、double forループは、mazeOの代わりにmazeとする必要があります。
  2. 出口座標が壁を指しているため、終了できません。
  3. あなたのコードには、移動方向を「選択」する手段がありません。したがって、あなたのパラメータから始めて、 "プレーヤー"は、34の間の線1に連続的にピンポン(左右に動く)を続けます。
  4. のでUndefined Behaviorバインドoutof 200ピンポン​​は、あなたのケースでセグメンテーションフォールト
関連する問題