其实如果不开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;
}