AcWing 4943. 方格迷宫
原题链接
困难
作者:
bakanoko
,
2025-04-01 11:08:02
· 广东
,
所有人可见
,
阅读 2
直接搜o(nmk)会超时,需要剪枝
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
char g[N][N];
int d[N][N];
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
int n, m, k;
int sx, sy, ex, ey;
void bfs(){
memset(d, -1, sizeof d);
queue<pair<int, int>> q;
q.push({sx, sy});
d[sx][sy] = 0;
while (q.size()) {
auto p = q.front();
q.pop();
int px = p.first, py = p.second;
for (int i = 0; i < 4; i++) {
int x = px, y = py;
for (int j = 1; j <= k; j++){
x += dx[i];
y += dy[i];
if (x >= 1 && x <= n && y >= 1 && y <= m) {
if (d[x][y] != -1 && d[x][y] <= d[px][py]) break;
else if (d[x][y] == -1) {
if (g[x][y] == '#') break;
d[x][y] = d[px][py] + 1;
q.push({x, y});
}
}
}
}
}
}
int main(){
cin >> n >> m >> k;
string s;
for (int i = 1; i <= n; i++) {
cin >> s;
for (int j = 1; j <= m; j++) {
g[i][j] = s[j-1];
}
}
cin >> sx >> sy >> ex >> ey;
bfs();
cout << d[ex][ey];
return 0;
}