私は迷路の問題でラットを解決するためのコードを作成しようとしています。 '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--
が含まれています。
であることをあなたのパス行列に取り組むポイント3
count
で説明した後、配列のインデックスが有効であるかどうかを確認することが不可欠である*前*そのインデックスでそのコンテンツをチェックします。 –アレイを使用する前に初期化する必要があることをご存知でしたか? – MrPaulch
バックトラックするときに 'count <0'というケースが発生した場合、それを処理する必要があります。そうしないと、ターゲットへのパスがない場合にコードが爆発します。しかし、これはおそらくあなたの直接の問題の原因ではありません。 –