BFS应用——走迷宫

AcWing 844. 走迷宫
给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。

最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。

数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条通路。

输入格式

第一行包含两个整数n和m。

接下来n行,每行包含m个整数(0或1),表示完整的二维数组迷宫。

输出格式

输出一个整数,表示从左上角移动至右下角的最少移动次数。

数据范围

1≤n,m≤100

输入样例:

5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

输出样例:

8

题目要求最少移动次数,是对BFS的应用
用数组模拟队列:用数组模拟栈和队列

#include<bits/stdc++.h>
using namespace std;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
typedef pair<int,int> PII;
const int N=110;

int n,m;
int g[N][N]; //存图
int d[N][N]; //每个点到起点的距离
PII q[N*N]; //模拟队列 

int bfs()
{
	int hh=0,tt=0; // 队头、队尾
	q[0]={0,0}; // 起点
	
	memset(d,-1,sizeof(d));
	d[0][0]=0;// 起点走过
	
	while(hh<=tt) // 队列非空
	{
	   PII t=q[hh++]; // 取队头+队头出队 
	   
	   for(int i=0; i<4; i++) // 四个方向遍历一下
	   {
	   	  int x = t.first + dx[i],y = t.second + dy[i]; // 队头元素某个方向的下一个元素 
	   	  
	   	  if(x>=0 && x<n && y>=0 && y<m && g[x][y] == 0 &&d[x][y] == -1)
	   	  {//没越界、且能走(为0)、且是第一次走 (d[x][y]=-1) 
	   	  	d[x][y] = d[t.first][t.second] + 1;  // d[x][y]=队头到起点的距离+1 
	   	  	q[++ tt]={x,y};  //入队 
		  }
	   }	
	} 
	return d[n-1][m-1]; // 返回右下角到起点的距离 
} 
int main()
{
	cin>>n>>m;
	for(int i=0; i<n; i++)
	  for(int j=0; j<m; j++)
	    cin>>g[i][j];
	
	cout<<bfs()<<endl;
	return 0;    
}

C++ stl queue:C++ queue知识点

#include<bits/stdc++.h>
using namespace std;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
typedef pair<int,int> PII;
const int N=110;

int n,m;
int g[N][N]; //存图
int d[N][N]; //每个点到起点的距离

int bfs()
{
	queue<PII> q;
	memset(d,-1,sizeof(d));
	q.push({0,0}); // 起点入队 
	d[0][0]=0; // 起点走过 
	
	while(!q.empty()) // 队列非空 
	{
		PII t=q.front(); // 取队头
		q.pop(); // 队头出队 
		
		for(int i=0; i<4; i++) //遍历四个方向
		{
		   int x = t.first + dx[i],y = t.second + dy[i];
		   
		   if(x>=0 && x<n && y>=0 && y<m && g[x][y] == 0 && d[x][y] == -1)
		   {
		   	  d[x][y] = d[t.first][t.second] + 1; // 到出发点的距离 
		   	  q.push({x,y}); // 入队 
		   } 	
		} 
	   	
	}
	return d[n-1][m-1]; 
} 

int main()
{
	cin>>n>>m;
	for(int i=0; i<n; i++)
	  for(int j=0; j<m; j++)
	    cin>>g[i][j];
	
	cout<<bfs()<<endl;
	return 0;    
}
发布了92 篇原创文章 · 获赞 183 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/wmy0217_/article/details/105006937