UVA ~ 11573 ~ Ocean Currents (01BFS)
阿新 • • 發佈:2018-12-15
題意
N*M的地圖,每個點有水流方向,如果你在當前點不按照當前點的水流方向走就會花費1的體力,Q次詢問,每次詢問從(sx,sy)到(ex,ey)的最小花費
思路
01BFS,也可以用優先佇列,優先佇列會慢一點。
01BFS(deque):
#include <bits/stdc++.h> using namespace std; const int MAXN = 1005; const int INF = 0x3f3f3f3f; const int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1}; const int dy[] = {0, 1, 1, 1, 0, -1, -1, -1}; int n, m, d[MAXN][MAXN]; char MAP[MAXN][MAXN]; struct Node { int x, y; Node(int x, int y) : x(x), y(y) {} }; int BFS(int sx, int sy, int ex, int ey) { memset(d, INF, sizeof(d)); deque<Node> Q; d[sx][sy] = 0; Q.push_front(Node(sx, sy)); while (!Q.empty()) { Node u = Q.front(); Q.pop_front(); for (int i = 0; i < 8; i++) { int xx = u.x + dx[i], yy = u.y + dy[i]; int flag = 0; if (MAP[u.x][u.y]-'0' != i) flag = 1; if (xx < 0 || xx >= n || yy < 0 || yy >= m) continue; if (d[xx][yy] > d[u.x][u.y] + flag) { d[xx][yy] = d[u.x][u.y] + flag; flag ? Q.push_back(Node(xx, yy)) : Q.push_front(Node(xx, yy)); } } } return d[ex][ey]; } int main() { scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) scanf("%s", MAP[i]); int T; scanf("%d", &T); while (T--) { int sx, sy, ex, ey; scanf("%d%d%d%d", &sx, &sy, &ex, &ey); sx--, sy--, ex--, ey--; int ans = BFS(sx, sy, ex, ey); printf("%d\n", ans); } return 0; } /* 5 5 04125 03355 64734 72377 02062 3 4 2 4 2 4 5 1 4 5 3 3 4 */
優先佇列:
#include <bits/stdc++.h> using namespace std; const int MAXN = 1005; const int INF = 0x3f3f3f3f; const int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1}; const int dy[] = {0, 1, 1, 1, 0, -1, -1, -1}; int n, m, d[MAXN][MAXN]; char MAP[MAXN][MAXN]; struct Node { int x, y, step; Node(int x, int y, int step) : x(x), y(y), step(step) {} bool operator < (const Node& that) const { return that.step < step; } }; int BFS(int sx, int sy, int ex, int ey) { memset(d, INF, sizeof(d)); priority_queue<Node> Q; d[sx][sy] = 0; Q.push(Node(sx, sy, 0)); while (!Q.empty()) { Node u = Q.top(); Q.pop(); for (int i = 0; i < 8; i++) { int xx = u.x + dx[i], yy = u.y + dy[i], step = u.step; if (xx < 0 || xx >= n || yy < 0 || yy >= m) continue; int flag = 0; if (MAP[u.x][u.y]-'0' != i) flag = 1, step++; if (d[xx][yy] > d[u.x][u.y] + flag) { d[xx][yy] = d[u.x][u.y] + flag; Q.push(Node(xx, yy, step)); } } } return d[ex][ey]; } int main() { scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) scanf("%s", MAP[i]); int T; scanf("%d", &T); while (T--) { int sx, sy, ex, ey; scanf("%d%d%d%d", &sx, &sy, &ex, &ey); sx--, sy--, ex--, ey--; int ans = BFS(sx, sy, ex, ey); printf("%d\n", ans); } return 0; } /* 5 5 04125 03355 64734 72377 02062 3 4 2 4 2 4 5 1 4 5 3 3 4 */