求解迷宫问题,一个迷宫包括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;} }
}
}