迷宫问题BFS和DFS(模板)

迷宫问题BFS和DFS(模板)

DFS的基本结构:

void dfs(int 参数1,int 参数2)  
{  
	    if(不满足要求) return;    //剪枝条件
	    if(达到目标值)  
	    {  
	        存储当前答案;  
	        return;  
	    }  
	    dfs(下一步);  
}

模板代码如下:

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
/*
迷宫问题的广度优先搜索和深度优先搜索
.表示路,#表示墙
起点[0,0],终点[n-1][m-1]
*/ 
struct node
{
	int x;  //纵轴坐标 
	int y;  //横轴坐标 
};
int dx[4]={0,1,0,-1};  //纵坐标的变化 
int dy[4]={1,0,-1,0};  //横坐标的变化 
int n,m;  //行数,列数 
char maze[25][25];  //存储迷宫的数组 
bool vis[25][25];   //标记数组 
int dir[25][25];   //距离数组 
void bfs(node start)  //广度优先搜索 
{
	node normal,temp;
	int xx,yy; 
	queue<node>q;   //定义一个保存坐标的队列 
	while(!q.empty())   q.pop(); //清空队列
	q.push(start);   //存入开始坐标 
	dir[start.x][start.y]=0;   //标记此点的步数为0 
	while(!q.empty())  //循环条件是队列不为空 
	{
		normal=q.front();  //取出队列中的坐标 
		q.pop();  //删除坐标 
		vis[normal.x][normal.y]=true;   //标记此坐标已经走过 
		for(int i=0;i<4;i++)   //循环遍历四个方向 
		{
			xx=normal.x+dx[i];  yy=normal.y+dy[i];
			if(xx>=0&&xx<n&&yy>=0&&yy<m&&maze[xx][yy]=='.'&&!vis[xx][yy])
			{   //坐标不超出坐标系范围,并且是路不是墙,而且从来没有走过 
				temp.x=xx;   temp.y=yy;
				q.push(temp);  //加入队列 
				dir[xx][yy]=dir[normal.x][normal.y]+1;  //走到此点是前一点的步数加一 
			}
		}
	}
}
void dfs(int xx,int yy)  //深度优先搜索 
{
	if(xx>=n || yy>=m || xx<0 || yy<0 || vis[xx][yy] || maze[xx][yy]=='#') return;
	//判断是否满足剪枝条件
    if(xx==n-1 && yy==m-1) 
	{
		cout<<"have way!"<<endl;
		return;
	}
	vis[xx][yy]=true;   //标志此地走过
	for(int k=0;k<4;k++)
		dfs(xx+dx[k],yy+dy[k]);   //往四个方向走
}
int main()
{
	node start;
	while(cin>>n>>m)  //n代表列数,m代表行数 
	{
		if(n==0&&m==0)  break;  
		memset(dir,0,sizeof(dir));  //初始化步数数组 
		memset(vis,false,sizeof(vis));  //初始化轨迹数组 
		for(int i=0;i<n;i++)
		   for(int j=0;j<m;j++)
		   {
		   	  cin>>maze[i][j];  //输入迷宫 
		   }
		start.x=0;  start.y=0;   //设置起点 
		memset(vis,false,sizeof(vis));  //初始化轨迹数组 
		bfs(start);    //开始广搜 
		if(dir[n-1][m-1]==0)  cout<<"no way!"<<endl;  //无法到达 
		else cout<<"need "<<dir[n-1][m-1]<<" steps"<<endl;   //可以到达,输出步数 
		memset(vis,false,sizeof(vis));   //初始化轨迹数组 
		dfs(0,0); 
	}
	return 0;
}
/*
3 3
..*
*.*
*..
5 5
.....
###.#
..#..
###..
...#.
*/

猜你喜欢

转载自blog.csdn.net/qq_39905917/article/details/84572841