AcWing 844. 走迷宫
原题链接
简单
作者:
阿飞被注册了
,
2021-05-02 16:59:24
,
所有人可见
,
阅读 280
因为边的权重是1 此时可以用bfs 来找最短路
最短路,链表也要初始化,不要忘记!!
C++ 代码
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
#define PII pair<int, int> //宏定义是真香 用typedef pair<int, int> PII 编译就不过
#define fi first
#define se second
using namespace std;
const int N = 110;
int g[N][N];// 存入图
int dis[N][N];//点到起点的距离
int xx[4] = {0, -1, 1, 0}, yy[4] = {1, 0, 0, -1};// 用矢量来进行点的上下左右的移动
int n, m;
int bfs(){
memset(dis, -1, sizeof dis);// 一定要初始化
queue<PII> q;//队列,存每一层的点
dis[0][0] = 0;
q.push({0, 0});
while(!q.empty())
{
auto t = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
int x = t.fi + xx[i], y = t.se + yy[i];
// 要保证 x,y不能越界;g[x][y] == 0表示该点可以走;dis[x][y] == -1表示该点没有走过,当走过两遍时就一定不是最短路径
if(0 <= x && x < n && y >= 0 && y < m && g[x][y] == 0 && dis[x][y] == -1)
{
//将该合法点距离存起来,并入对
dis[x][y] = dis[t.fi][t.se] + 1;
q.push({x,y});
}
}
}
return dis[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];
int ans = bfs();
cout << ans;
return 0;
}
你的typedef pair[HTML_REMOVED] PII忘了加分号了/xyx
好家伙
重学图论 2021-5-2