解决迷宫并打印C中的正确路径

时间:2016-09-22 07:01:19

标签: c arrays data-structures stack maze

我正在尝试制作一个代码来解决迷宫问题中的老鼠。 ' 1'是用于墙壁和' 0'是免费的。所有采用的路径都存储在2D阵列路径[200] [2]中。还可以通过用' *'替换路径字符来打印路径解决方案。此外,我正在取代已经采取的路径' 1'这样我们就不会再次走这条路了。

我的代码:

#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中它没有给出任何错误,但它没有打印正确的路径迷宫。

最终工作解决方案:

我需要的只是在else循环中maze[cx][cy] = '1'。还将if循环条件(cy-1)>0更改为(cy-1)>=0并将(cx-1)>0更改为(cx-1)>=0。还包括count--循环中的if(count>=0)

2 个答案:

答案 0 :(得分:0)

正如@ Klas-Lindbäck已经提到的那样,你不会把计数变为负数。然后它将开始在数组外部索引path []并发生不好的事情。

找不到路径的原因是因为(5,6)是墙。也许你的意思是(4,6)?

此外,左列和上行不允许访问,因为您检查(cy-1)&gt; 0而不是&gt; = 0.

除了你的回溯步骤需要将迷宫[cx] [cy]设置为1以防止一遍又一遍地进入相同的路径。

答案 1 :(得分:0)

许多问题:

  1. 同时检查if内的所有maze[cx][cy],同时将迷宫数据存储到mazeO矩阵中。或者,for for循环可以填充maze而不是mazeO
  2. 您的出口坐标指向墙壁,因此无法退出。
  3. 您的代码无法选择&#34;运动方向。所以从你的参数开始,&#34;播放器&#34;在位置13之间的4行上连续乒乓(左右移动)。
  4. 在第3点count中描述的200个乒乓球将解决您的路径矩阵,因此Undefined Behavior在您的情况下是分段错误