问题描述:给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径。
算法描述:
1.从入口开始,对下,右,上,左方向依次试探。若有路可走且没走过,则走。若无路可走则回溯回上一步继续试探
2.当走到出口时,输出该组路线并回溯回上一步寻找下一条路线
代码如下:
#include
#define R 7
#define C 7
int Move[4][2]={1,0,0,1,-1,0,0,-1};//下一步的方向 :move[0][]下move[1][]右move[2][]上move[3][]左;
int M[R+2][C+2]={{0,0,0,0,0,0,0,0,0},{0,1,1,0,1,0,0,0,0},{0,1,1,0,0,0,0,0,0},{0,0,1,1,0,0,0,0,0},
{0,1,0,1,1,0,0,0,0},{0,0,0,1,1,0,0,0,0},{0,0,0,0,1,1,1,0,0},{0,0,0,1,1,0,1,1,0},{0,0,0,0,0,0,0,0,0}}; //初始化迷宫,1为路,0为墙
int Q[R+2][C+2]={0};
int stack[100][2]; //存放路线
int top=0; //栈顶
int cnt=1;//找到解的累加器
void PrintWay(){
int i=0;
printf("第%d条路线:",cnt++);//找到一组解累加一次
for(;i ",stack[i][0],stack[i][1]);
}
printf("%d,%d ",stack[i][0],stack[i][1]);
printf("\n");
}
/*
函数作用:试探迷宫的所有路线
函数参数:人当前的位置X,Y
无返回值
*/
int Maze(int x,int y){
if(x==7&&y==7){
//如果走到出口,打印出迷宫的当前解
PrintWay();
}else{ //下右上左依次试探
int a,b,i;
for(i=0;i<4;i++){
a=x+Move[i][0];
b=y+Move[i][1];
if(M[a][b]&&!Q[a][b]){ //如果该方向能走且没走过
Q[a][b]=1;
top++;
stack[top][0]=a;
stack[top][1]=b;
Maze(a,b);
Q[a][b]=0;
top--; //出栈
}
}
}
}
//打印迷宫
void PrintMaze(){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
printf("%d ",M[i][j]);
}
printf("\n");
}
}
int main(void){
PrintMaze(); //打印迷宫
printf("\n");
stack[0][0]=stack[0][1]=1; //入口(1,1)先入栈
M[1][1]=0;
Maze(1,1);
}
运行结果如下: