使用三维数组的更好实现方法
查看原帖
使用三维数组的更好实现方法
745926
yu7uan楼主2024/1/26 12:31

其实如果不开long long,数组可以开到1e7,不需要结构体,用一个三维数组就可以更快地完成。

#include<bits/stdc++.h>
// #define int long long
#define rep(i, a, b) for(int i = (a); i <= (b); i ++)
using namespace std;

typedef tuple<int, int, int> pi3;
const int M = 1e3 + 5;
const int dx[] {1, 0, -1, 0};
const int dy[] {0, 1, 0, -1};
string a[M];
int d[M][M][15];
int N, K;

int bfs(){
    
    queue<pi3> q;
    memset(d, -1, sizeof d);
    q.push({0, 0, 0});
    d[0][0][0] = 0;
    while(q.size()){
        auto [x, y, k] = q.front(); q.pop();
        if(x == N - 1 && y == N - 1) return d[x][y][k];
        // printf("%d %d %d %d\n", x, y, k, d[x][y][k]);
        rep(i, 0, 3){
            int t = max(0, k - 1);
            int xx = x + dx[i], yy = y + dy[i];
            if(xx < 0 || xx >= N || yy < 0 || yy >= N) continue;
            if(a[xx][yy] == '#') continue;
            if(a[xx][yy] == 'X' && k == 0) continue;
            if(a[xx][yy] == '%') t = K;
            if(d[xx][yy][t] == -1){
                d[xx][yy][t] = d[x][y][k] + 1;
                q.push({xx, yy, t});
            }
        }
    }
    return -1;
}
signed main(){
    
    cin >> N >> K;
    rep(i, 0, N - 1) cin >> a[i];
    
    cout << bfs() << endl;
    
    return 0;
}
2024/1/26 12:31
加载中...