题意:一个人要从2先走到4再走到3,计算最少路径。
析:其实这个题很水的,就是要注意,在没有到4之前是不能经过3的,一点要注意。其他的就比较简单了,就是一个双向BFS,先从2搜到4,再从3到搜到4,
然后求最短路即可。
代码如下:
#include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring> #include <set> #include <queue> #include <string> #include <algorithm> #include <vector> #include <map> using namespace std ; typedef long long LL; typedef pair<int, int> P; template<class T>T scan(T &x){ int f = 1; x = 0; char c; while(c = getchar(), c < 48) if(c == '-') f = -1; do x = x * 10 + (c^48); while(c = getchar(), c > 47); x *= f; return x; } const int INF = 0x3f3f3f3f; const double inf = 0x3f3f3f3f3f3f3f; const double eps = 1e-11; const int maxn = 1000 + 5; const int dr[] = {0, 0, -1, 1}; const int dc[] = {-1, 1, 0, 0}; struct node{ int x, y; node(int xx = 0, int yy = 0) : x(xx), y(yy) { } }; int n, m; int a[maxn][maxn]; int vis1[maxn][maxn]; int vis2[maxn][maxn]; vector<node> v; inline bool is_in(int r, int c){ return r >= 0 && r < n && c >= 0 && c < m; } void bfs(int r, int c, int vis[][maxn], bool ok){ queue<node> q; q.push(node(r, c)); vis[r][c] = 0; while(!q.empty()){ node u = q.front(); q.pop(); for(int i = 0; i < 4; ++i){ int x = u.x + dr[i]; int y = u.y + dc[i]; if(vis[x][y] != INF || !is_in(x, y) || a[x][y] == 1) continue; if(!ok && a[x][y] == 3) continue; vis[x][y] = vis[u.x][u.y] + 1; q.push(node(x, y)); } } } int main(){ scanf("%d %d", &m, &n); int sx, sy, ex, ey; for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j){ scanf("%d", &a[i][j]); if(a[i][j] == 4) v.push_back(node(i, j)); else if(a[i][j] == 2) sx = i, sy = j; else if(a[i][j] == 3) ex = i, ey = j; } for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j) vis1[i][j] = vis2[i][j] = INF; bfs(sx, sy, vis1, false); bfs(ex, ey, vis2, true); int ans = INF; for(int i = 0; i < v.size(); ++i){ ans = min(ans, vis1[v[i].x][v[i].y]+vis2[v[i].x][v[i].y]); } cout << ans << endl; return 0; }