该方法在解迷宫时用到了递归法
因为在使用递归函数时,会先执行一条路一直到头不能继续走了的时候才会换下一条路,虽然路径信息存储在"linshi"中,但并不把它导入到"shuju"中。当此路不同时需要换一条路时,由于步数是作为参数传入函数的,其值并没有改变(记录了分叉点位置),所以在执行下一条路线时,在"linshi"中的记录会从分叉点开始记录下一条路线,之后的数据会覆盖原来的数据,表示为此条路的路径信息,在到达出口时,将会把在"linshi"中存储的路径信息复制到"chucun"中,最后输出路径时也是从"chucun"中输出。
#include
int dfs(int x,int y,int shuju[1000][1000],int chucun[500][2],int linshi[500][2],int bushu,int n,int *p){
if(shuju[y][x]!=0)return 0;//如果当前坐标下已被探索过,或者是墙,则不执行dfs
if(shuju[y][x]==0)shuju[y][x]=bushu;//如果没有被探索过且不是墙,则用"bushu"标记该位置
if(x==n-2 && y==n-2){//走到了迷宫的出口
*p=bushu;//用指针返回走了多少步
for(int a=0;a<=bushu;a++){//把步骤从"linshi"中导入到"chucun"中
chucun[a][0]=linshi[a][0];
chucun[a][1]=linshi[a][1];
}
}
bushu++;//如果该位置没有被探索过,则"bushu"加一
if(x<n && shuju[y][x+1]==0){//该位置下方一个格为空,且下一个格没有到边界
linshi[bushu-3][0]=x;//把此时的位置存储到"linshi"中
linshi[bushu-3][1]=y;
dfs(x+1,y,shuju,chucun,linshi,bushu,n,p);//向下执行"dfs"
}
if(x>0 && shuju[y][x-1]==0){//后同理
linshi[bushu-3][0]=x;
linshi[bushu-3][1]=y;
dfs(x-1,y,shuju,chucun,linshi,bushu,n,p);
}
if(y<n && shuju[y+1][x]==0){
linshi[bushu-3][0]=x;
linshi[bushu-3][1]=y;
dfs(x,y+1,shuju,chucun,linshi,bushu,n,p);
}
if(y>0 && shuju[y-1][x]==0){
linshi[bushu-3][0]=x;
linshi[bushu-3][1]=y;
dfs(x,y-1,shuju,chucun,linshi,bushu,n,p);
}
}
int shuju[1000][1000];//存储迷宫数据
int chucun[5000][2]={};//存储最终可以到达终点的路线的所有点的坐标
int linshi[5000][2]={};//临时存储点的坐标
int main() {
int n;
scanf("%d",&n);//输入正方形迷宫的大小
for(int a=0;a<n;a++)for(int b=0;b<n;b++)scanf("%d",&shuju[a][b]);
int bushu=2;//因为用"0"表示空格、"1"表示边界(墙),为避免标记路径时与墙重复,则设初始为2
int *p=&bushu;//因为函数深度会非常深,用"return"不易返回数据,故用指针在走到出口时返回走了多少步
int x=1,y=1;//初始时定义入口为(1,1)
dfs(x,y,shuju,chucun,linshi,bushu,n,p);//开始寻找路径
for(int a=0;a<n;a++){//输出迷宫
for(int b=0;b<n;b++)printf("%2d ",shuju[a][b]);
printf("\n");
}
if(bushu==2)printf("被堵了");//如果此迷宫不能从入口到达出口,则输出"被堵了"
for(int a=0;a<*p-2;a++)printf("%d %d\n",chucun[a][0],chucun[a][1]);//输出"cunchu"中的最终路线坐标
}
测试数据
10
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 1 0 1
1 0 0 1 0 0 0 1 0 1
1 0 0 0 0 1 1 0 0 1
1 0 1 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0 0 1
1 0 1 0 0 0 1 0 0 1
1 0 1 1 1 0 1 1 0 1
1 1 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
17
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1
1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 1 1
1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 1 1
1 0 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1
1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 1 1
1 0 1 1 0 0 0 0 1 1 1 1 0 0 0 1 1
1 1 1 0 1 1 1 1 0 1 1 0 0 1 0 0 1
1 0 0 0 1 0 0 0 0 0 1 1 1 1 1 0 1
1 0 1 1 1 0 1 0 1 0 1 1 0 0 0 0 1
1 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1
1 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1
1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1
1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1
1 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1
1 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1