2020-02-11
BFS 宽度优先搜索
使用此方法搜索到的是最短路。
只有当边的权为1时才能使用BFS求最短路,dp问题不适用。
算法原理:
首先把初始状态加入队列
while(队列非空)
{
把队头取出;
扩展队头;
}
//AcWing 846
#include<iostream>
#include<algorithm>
#include<cstring>
//#include<queue>
using namespace std;
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;
int dx[4] = {-1, 0 ,1 ,0},dy[4] = {0, 1, 0,-1 };//向量表示上下左右四个方向移动
while (hh<= tt)
{
auto t = q[hh ++ ];
for (int i = 0;i < 4;i ++ )
{
int x = t.firet + 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[ ++ 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;
}