40分,求助
查看原帖
40分,求助
505484
冬笙夏洛_楼主2022/8/2 13:14
// problem :  

#include <bits/stdc++.h>
using namespace std;
#define ll long long
typedef pair<int, int> PII;
#define pb push_back

int n, m; 
char mp[1005][1005];
int f[12];
struct node {
    int x, y, t;
    bool operator < (const node & k) const {
        return t > k.t;
    }
};
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
bool vis[1005][1005];
// 能否走到mp[x][y]
inline bool check(int x, int y) {
    if (x < 1 || x > n || y < 1 || y > m || vis[x][y] || mp[x][y] == 'X') return false;
    return true;
}
// 判断 跳 2^j 步时,2^(j - 1) 与 2^j之间是否有障碍
inline bool judge(int x, int y, int i, int j, int ddx, int ddy) {
    if (j < 0) return true;
    int dx = x + dir[i][0] * f[j];
    int dy = y + dir[i][1] * f[j];
    if (dx == ddx) {
        for (int k = dy; k <= ddy; ++k)
            if (mp[dx][k] == 'X') return false;
    } else {
        for (int k = dx; k <= ddx; ++k)
            if (mp[k][dy] == 'X') return false;
    }
    return true;
}
int bfs() {
    priority_queue<node> q;
    q.push({1, 1, 0});
    vis[1][1] = true;
    while (!q.empty()) {
        node u = q.top(); q.pop();
        int x = u.x, y = u.y, t = u.t;
        if (mp[x][y] == '#') return t;
        for (int i = 0; i < 4; ++i) {
            for (int j = 0; j < log2(n); ++j) {
                int dx = x + dir[i][0] * f[j];
                int dy = y + dir[i][1] * f[j];
                if (check(dx, dy) && judge(x, y, i, j - 1, dx, dy)) {
                    vis[dx][dy] = true;
                    q.push({dx, dy, t + 1});
                }
            }
        }
    }
    return -1;
}
int main(){
    scanf("%d %d", &n, &m);
    f[0] = 1;
    for (int i = 1; i <= 10; ++i) f[i] = f[i - 1] * 2;
    for (int i = 1; i <= n; ++i)
        scanf("%s", mp[i] + 1);
    printf("%d\n", bfs());

    return 0;
}
2022/8/2 13:14
加载中...