11573 - Ocean Currents

来源:互联网 发布:淘宝的优化建议 编辑:程序博客网 时间:2024/06/06 05:41

这题必须要加优先队列优化 不然会超时

#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int maxn = 1000 + 7;const int INF = ~0U >> 1;const int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1};const int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};char str[maxn][maxn];struct node {    int x, y;    int val;    node(int a, int b, int c) : x(a), y(b), val(c) { }    bool operator<(const node &rhs) const {        return val > rhs.val;    }};int m, n;int q, sx, sy, ex, ey;int vis[maxn][maxn];int BFS() {    int ans = INF;    priority_queue<node> que;    memset(vis, -1, sizeof(vis));    vis[sx][sy] = 0;    que.push(node(sx, sy, 0));    while(!que.empty()) {        node u = que.top(); que.pop();        if(u.x == ex && u.y == ey) {            return u.val;        }        for(int i = 0; i < 8; ++i) {            int nx = dx[i] + u.x, ny = dy[i] + u.y;            if(nx >= 1 && nx <= m && ny >= 1 && ny <= n) {                int d = u.val;                if(str[u.x][u.y] - '0' != i) d += 1;                if(vis[nx][ny] == -1 || vis[nx][ny] > d) {                    vis[nx][ny] = d;                    que.push(node(nx, ny, d));                }            }        }    }    return ans;}int main() {    while(scanf("%d%d", &m, &n) != EOF) {        for(int i = 1; i <= m; ++i)            scanf("%s", str[i] + 1);        scanf("%d", &q);        for(int i = 0; i < q; ++i) {            scanf("%d%d%d%d", &sx, &sy, &ex, &ey);            int ans = BFS();            printf("%d\n", ans);        }    }    return 0;}


0 0
原创粉丝点击