bfs(走迷宫)
bfs是宽搜,可以用来求边权是1的最短路,先上例题吧
给定一个
最初,有一个人位于左上角
请问,该人从左上角移动至右下角
数据保证
输入格式
第一行包含两个整数
接下来
输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。
数据范围
输入样例:
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
这个边权是1,很经典的一个bfs的题目
这个就是具体的一个宽搜的一个过程,由过程也可知,只要先搜到终点的那个路径一定是最短的,注意这句话有两个关键词:①能搜到②先搜到
只有满足这两个条件才是我们需要的最短路径,这个过程可以用队列来模拟,因为先搜过的点用过了,就可以不再用了,属于队列的先进先出的一个原则,就可以用队列来实现
#include#include #include #include using namespace std; typedef pair<int,int> PAII; const int N=200; int g[N][N],d[N][N];//g存的是地图,d代表到起点所搜索的距离 int n,m; int bfs() { queue q;//用队列来实现宽搜的操作 memset(d,-1,sizeof(d));//所有的点都没有被搜过,就都赋值为-1 q.push({0,0});//从0开始; d[0][0]=0;//初始化 while(q.size())// { auto t=q.front(); q.pop(); int dx[4]={-1,1,0,0};//实现上下左右遍历 int dy[4]={0,0,1,-1}; for(int i=0;i<4;i++) { int x=t.first+dx[i],y=t.second+dy[i];//遍历到新的点左边 if(x>=0&&y>=0&&x 1&&g[x][y]==0) { d[x][y]=d[t.first][t.second]+1;//序号+1 q.push({x,y});//把新的遍历且符合要求的点存入队列 } } } return d[n-1][m-1]; } int main(){ cin>>n>>m; for(int i=0;i ) for(int j=0;j ) cin>>g[i][j]; cout< endl; return 0; }