65 分求助
查看原帖
65 分求助
773235
dctc1494楼主2024/8/4 10:37
#include <bits/stdc++.h>

using namespace std;

const int N = 1e2 + 5;
const int INF = 0x3f;

const int dx[] = {0, 0, -1, 1}, dy[] = {1, -1, 0, 0};

struct Node {
    int x, y, w, col;
    bool magic;
};

int m, n, x, y, c, ans = INF, g[N][N], f[N][N];
bool v[N][N];

bool operator < (Node x, Node y) {
    return x.w > y.w;
}

int bfs(int x_1, int y_1, int x_2, int y_2) {
    priority_queue<Node> q;
    q.push({x_1, y_1, 0, g[1][1], true});
    v[x_1][y_1] = false;
    while (!q.empty()) {
        Node qf = q.top();
        q.pop();
        int x = qf.x, y = qf.y, w = qf.w, col = qf.col;
        bool magic = qf.magic;
        if (x == x_2 && y == y_2) {
            ans = min(ans, w);
        }
        for (int i = 0; i < 4; ++i) {
            int mx = x + dx[i], my = y + dy[i];
            if (mx >= 1 && my >= 1 && mx <= m && my <= m && v[mx][my]) {
                v[mx][my] = false;
                if (g[mx][my] == 0) {
                    if (magic) {
                        q.push({mx, my, w + 2, g[x][y], false});
                    }
                } else {
                    if (col == g[mx][my]) {
                        q.push({mx, my, w, g[mx][my], true});
                    } else {
                        q.push({mx, my, w + 1, g[mx][my], true});
                    }
                }
            }
        }
    }
    if (ans == INF) {
        return -1;
    } else {
        return ans;
    }
}

int main() {
    memset(v, true, sizeof(v));
    memset(g, 0, sizeof(g));
    memset(f, 0, sizeof(f));
    cin >> m >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> x >> y >> c;
        g[x][y] = c + 1;
    }
    cout << bfs(1, 1, m, m) << endl;

    return 0;
}

我一开始写深搜,拿过 5 分,10 分,15 分。

然后后面开始写广搜,正常写法拿了 40 分,后面把队列改成了优先队列,拿了 45 分,后面又改了改,变成了现在的 65 分。

我觉得应该是有些条件没判断到,但是我又 DEBUG 不出来,请大佬们指点。

2024/8/4 10:37
加载中...