走迷宫问题

求解迷宫问题,一个迷宫包括m行*n列个方格,用0表示可以通行,1表示是墙壁,即不可通行。迷宫只有一个入口和一个出口,设入口为(0,0),出口为(m,n)。
从迷宫中的某一个坐标位置向东,西,南,北任一方向移动一步时,若前面的方格为0,则可以前移一步,否则通行受阻不可前进。按照顺时针方向改变为下一个方向移动。求解迷宫问题从入口点出发寻找一条可以通向出口的路径,并打印出这条路。
现假设这个迷宫为(免得麻烦了)
0 0 1 1
1 0 0 1
1 1 0 1
1 1 0 0
为了避免判断边界条件和进行不同处理的麻烦,有些边界只能向两个方向走,有些边界只能向三个方向走。可在迷宫的周围镶上边框,就是再加一层全是1的墙。
1,1,1,1,1,1,
1,0,0,1,1,1,
1,1,0,0,1,1,
1,1,1,0,1,1,
1,1,1,0,0,1,
1,1,1,1,1,1
用一个数组来储存迷宫的数据,用另外一个镶上墙的数组来作为辅助数组,处理是否走到过这个点(由0到1),避免重复走相同的路,用一个move数组来作为向东,西,南,北,走的数据。成功走出一步之后,递归进入下一个函数,直到走到终点,或者无路可走为止。C代码如下:

    #include<stdio.h>
    int a[4][4]={0,0,1,1,
                 1,0,0,1,
                 1,1,0,1,
                 1,1,0,0,};
    int b[6][6]={1,1,1,1,1,1,
                 1,0,0,1,1,1,
                 1,1,0,0,1,1,
                 1,1,1,0,1,1,
                 1,1,1,0,0,1,
                 1,1,1,1,1,1};
    int maze[4][2]={{0,1},
                    {1,0},
                    {0,-1},
                    {-1,0}};
    int x=3,y=3;
    int go(int x,int y);                
    int main(){
        int t=0,p=0;
         go(t,p);
         printf("%d,%d",t,p);
        return 0;}
    int go(int m,int n){
        int h,q;
        int i;
        if(m==x&&n==y)
        {return 1;}
        for(i=0;i<4;i++){
            h=m+maze[i][0];
            q=n+maze[i][1];
        if(b[h+1][q+1]==0)
         {b[h+1][q+1]=1;
          if(go(h,q))
          {printf("%d,%d\n",h,q);
           return 1;} }
        } 
    }
    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/xgogoforit/article/details/50212271
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞