最简单迷宫-(DFS&BFS初步学习)

描述:

给出迷宫,起点和终点,求出起点到终点的最短距离,(只能上下左右走,一格距离1)

DFS

#include <iostream>
#include <algorithm>

using namespace std;
                           //迷宫,x,y从 (1,1)开始、  
int minn = 0x3f3f3f3f;
int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}}; //方向坐标 向右,向下,向左,向上 
int a[50][50];
int book[50][50]; 
int n,m;
int sx,sy,ex,ey;

void DFS(int x,int y,int step) //当前的位置,已经走的步数 
{
	if(x == ex && y == ey) // 如果已经到了,比较步数 
	{
		if(step < minn)
			minn = step;
		return;
	}
	for(int i = 0;i < 4;i ++)   //每一步有四个方向可以选择 
	{
		int nx = x + next[i][0];
		int ny = y + next[i][1]; //下步的坐标。
		
		if(nx <1 || nx > n || ny < 1 || ny > m)   // 如果出界
			continue;
		
		if(a[nx][ny] == 0 && book[nx][ny] == 0)  //如果这个点不是障碍物,并且没有在路径中。
		{
			book[nx][ny] = 1;     //标记这个点
			DFS(nx,ny,step + 1);  //开始尝试下一个点
			book[nx][ny] = 0;     //尝试结束,取消这个点的标记,下面是换下一个方向 
		} 
	} 
	return;
}

int main()
{
	
	
	cin>>n>>m;
	for(int i = 1;i <= n;i ++)
	{
		for(int j = 1;j <= m;j ++)
		{
			cin>>a[i][j];
		}
	}
	cin>>sx>>sy>>ex>>ey;
	DFS(sx,sy,0);
	cout<<minn<<endl;
	return 0;
}

BFS

#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

struct Note
{
	int x; //横坐标 
	int y; //纵坐标 
	int s; //步数 
 };
Note N;
queue<Note> q;
int a[51][51]; //储存地图
int book[51][51] = {0}; 

int next[4][2] = {{0,1},
				  {1,0}, 
				  {0,-1},
				  {-1,0}}; 
int n,m;
int sx,sy,ex,ey;
int flag;
int main()
{
	int nx,ny;//下一个点的坐标 
	scanf("%d %d",&n,&m);
	for(int i = 1;i <= n;i ++)
	{
		for(int j = 1;j <= m;j ++)
			scanf("%d",&a[i][j]);
	}
	scanf("%d %d %d %d",&sx,&sy,&ex,&ey);
	N.x = sx;
	N.y = sy;
	N.s = 0;
	q.push(N);//先把起点加入队列中 
	book[sx][sy] = 1; //起点已经访问过
	
	flag = 0; //标记是否到达目标点 
	
	while(!q.empty()) //当队列不为空的时候
	{
		for(int i = 0;i < 3;i ++) //四个方向
		{
			N.x = q.front().x + next[i][0];
			N.y = q.front().y + next[i][1]; //新点的坐标 
			//判断是否越界
			if(N.x < 1 || N.x > n || N.y < 1 || N.y > n)
				continue;
			//判断是否是障碍物或者已经再路径中
			if(a[N.x][N.y] == 0 && book[N.x][N.y] == 0)
			{
				book[N.x][N.y] = 1;
				//新点加入到队列中
				N.s = q.front().s + 1;
				q.push(N);
			}
			if(N.x == ex && N.y == ey)
			{
				flag = 1;
				break; 
			 } 
		}
		
		if(flag == 1)
			break;
		q.pop(); //一个点的四个方向都判断过了,就删除队首,再进行扩展	
	} 
	
	printf("%d\n",q.back().s); 
	return 0;
 } 
 

猜你喜欢

转载自blog.csdn.net/qq_41003528/article/details/80241632