我試圖編寫一個代碼來解決迷宮問題中的老鼠。 '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--
。
它是必不可少的,以檢查是否數組的索引是有效* *前你在那個索引處檢查它的內容。 –
您是否知道在使用它之前您必須初始化一個數組? – MrPaulch
如果您在回溯時遇到'count <0'的情況,您需要處理它 - 否則如果沒有目標路徑,您的代碼將會爆炸(或其他)。這可能不是你的直接問題的原因,但。 –