深度优先法Depth-First-Search(递归函数)解迷宫问题

该方法在解迷宫时用到了递归法
因为在使用递归函数时,会先执行一条路一直到头不能继续走了的时候才会换下一条路,虽然路径信息存储在"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

你可能感兴趣的:(深度优先法Depth-First-Search(递归函数)解迷宫问题)