迷宫问题 dfs bfs

从迷宫入口点(1,1)出发,出口点(m,n);

1.求所有路径条数

2.求最短路径条数

3.输出一条最短路径

题解:向四周搜索,记下所有一步能到达的坐标点;然后依次再从这些点出发,再记下所有一步能到达的坐标点,…,依此类推,直到到达迷宫的出口点(m,n)为止,然后从出口点沿搜索路径回溯直至入口。这样就找到了一条迷宫的最短路径,否则迷宫无路径。

bfs求2,3

#include<stdio.h>
#define m 5
#define n 5

struct point{
	int x;
	int y;
	int pre;
	int len;
}Q[5005];

int ans=0;
int a[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
int f[m+2][n+2]={1,1,1,1,1,1,1,//0可以过 
                 1,0,0,0,1,0,1,
                 1,0,1,0,0,0,1,
                 1,0,0,1,0,1,1,
                 1,1,1,0,1,0,1,
                 1,0,1,1,1,0,1,
                 1,1,1,1,1,1,1};
void Out(int k){//输出一条最短路径
	while(Q[k].pre>0){
		printf("(%d,%d)<--",Q[k].x,Q[k].y);
		k=Q[k].pre;
	}
	printf("(%d,%d)",Q[1].x,Q[1].y);
}

void bfs(){
	int i,j,k=1,top=1,x1,y1,find=0;
	Q[k].x=1;//始点入队列 
	Q[k].y=1;
	Q[k].pre=0;
	Q[k].len=0;
	f[1][1]=-1;
	while(top<=k && !find){
		for(i=0;i<8;i++){
			x1=Q[top].x+a[i][0];
			y1=Q[top].y+a[i][1];
			if(f[x1][y1]==0){
				k++;
				Q[k].x=x1;//入队列
				Q[k].y=y1;
				Q[k].pre=top;
				Q[k].len=Q[top].len+1;
				f[x1][y1]=-1;//避免重复搜索 
			}
			if((x1==m) && (y1==n)){
				find=1;
				printf("%d\n",Q[k].len);//输出最短路径长度 
				Out(k);//输出一条最短路径
				break;
			}
		}
		top++;
	}
	if(find==0){
		printf("NO path\n");
	}
	
}

int main(){
	bfs();
	return 0;
} 

dfs求1

#include<stdio.h>
#define m 5
#define n 5

struct point{
	int x;
	int y;
	int pre;
}Q[5005];

int ans=0;
int a[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
int f[m+2][n+2]={1,1,1,1,1,1,1,//0可以过
                 1,0,0,0,1,0,1,
                 1,0,1,0,0,0,1,
                 1,0,0,1,0,1,1,
                 1,1,1,0,1,0,1,
                 1,0,1,1,1,0,1,
                 1,1,1,1,1,1,1};

int dfs(int x,int y){
	int i,x1,y1;
	if(x==m&&y==n){
		ans++;
		return 0;
	}
	else{
		for(i=0;i<8;i++){
			x1=x+a[i][0];
			y1=y+a[i][1];
			if(f[x1][y1]==0){
				f[x1][y1]=1;
				dfs(x1,y1);
				f[x1][y1]=0;
			}
		}
	}
	return 0;
}

int main(){
	f[1][1]=0;
	dfs(1,1);
	printf("%d",ans);
	return 0;
} 

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/qq_36183935/article/details/72677486
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞