#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int H, W, K;
vector<string> a;
int dist[2005][2005];
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> H >> W >> K;
int sx, sy, tx, ty;
cin >> sx >> sy >> tx >> ty;
sx--, sy--, tx--, ty--;
a.resize(H);
for (int i = 0; i < H; i++) cin >> a[i];
deque<pair<int,int>> dq;
// dist[y][x] = số operations ít nhất
for(int i=0; i<H; i++)
for(int j=0; j<W; j++)
dist[i][j] = INF;
dist[sx][sy] = 0;
dq.push_front({sx, sy});
while(!dq.empty()) {
auto [x, y] = dq.front();
dq.pop_front();
// BFS trắng (0 cost)
for(int d=0; d<4; d++){
int nx = x + dx[d];
int ny = y + dy[d];
if(nx<0 || ny<0 || nx>=H || ny>=W) continue;
// đi sang ô trắng = không tốn cost
if(a[nx][ny] == '.' && dist[nx][ny] > dist[x][y]) {
dist[nx][ny] = dist[x][y];
dq.push_front({nx, ny});
}
}
// Nếu phá tường (mở rộng K ô)
int cost = dist[x][y] + 1;
for(int i = max(0, x - K); i <= min(H - 1, x + K); i++){
for(int j = max(0, y - K); j <= min(W - 1, y + K); j++){
// Chỉ xét ô còn chưa tối ưu
if(dist[i][j] > cost){
dist[i][j] = cost;
dq.push_back({i, j});
}
}
}
}
cout << (dist[tx][ty] == INF ? -1 : dist[tx][ty]) << "\n";
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |