#include <bits/stdc++.h>
using namespace std;
int R, C, N;
bool isBest(int d1, int d2, pair<int, int> p){
int mn1 = min(d1, d2);
int mx1 = max(d1, d2);
int mn2 = min(p.first, p.second);
int mx2 = max(p.first, p.second);
if(!((mx1 <= N && mn1 < N) || (mx2 <= N && mn2 < N))) return false;
// cout << "d1 " << d1 << " d2 " << d2 << "\n";
if(mx1 == mx2) return mn1 < mn2;
else return mx1 < mx2;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> R >> C >> N;
int Sr, Sc, Gr, Gc; cin >> Sr >> Sc >> Gr >> Gc; Sr--; Sc--; Gr--; Gc--;
vector<string> v(R);
for(auto &i : v) cin >> i;
vector<pair<int, int>> added = {{Sr, Sc}};
vector<vector<int>> dist(R, vector<int>(C, 1e9));
vector<vector<bool>> vis(R, vector<bool>(C, false));
vector<vector<pair<int, int>>> best(R, vector<pair<int, int>>(C, {1e9, 1e9}));
dist[Sr][Sc] = 0;
for(int t = 0; t < R*C; t++){
if(t%2==0){
//Time to freely expand;
queue<pair<int, int>> q;
for(pair<int, int> p : added){
q.push(p);
}
added.clear();
while(!q.empty()){
int i = q.front().first; int j = q.front().second; q.pop();
// cout << "i " << i+1 << " j " << j+1 << " dist " << dist[i][j] << "\n";
added.push_back({i, j});
for(int ai = -1; ai <= 1; ai++){
for(int aj = -1; aj <= 1; aj++){
if(ai * aj != 0 || i + ai < 0 || i + ai >= R || j + aj < 0 || j + aj >= C) continue;
int ni = i + ai; int nj = j + aj;
// cout << "ni " << ni << " nj " << nj << "\n";
if(v[ni][nj] == '.' && dist[ni][nj] > dist[i][j]){
dist[ni][nj] = dist[i][j];
q.push({ni, nj});
}
}
}
}
}else{
priority_queue<tuple<int, int, int, int>> q;
int d = 0;
for(pair<int, int> p : added){
q.push({0, 0, p.first, p.second});
best[p.first][p.second] = {0, 0};
d = dist[p.first][p.second];
}
added.clear();
while(!q.empty()){
int i = get<2>(q.top()); int j = get<3>(q.top()); q.pop();
if(vis[i][j]) continue;
vis[i][j] = true;
if(best[i][j].first != 0 || best[i][j].second != 0){
added.push_back({i, j});
}
for(int ai = -1; ai <= 1; ai++){
for(int aj = -1; aj <= 1; aj++){
if(ai * aj != 0 || i + ai < 0 || i + ai >= R || j + aj < 0 || j + aj >= C) continue;
int ni = i + ai; int nj = j + aj;
if(dist[ni][nj] > d && isBest(best[i][j].first+abs(ai), best[i][j].second+abs(aj), best[ni][nj])){
dist[ni][nj] = d+1;
best[ni][nj] = {best[i][j].first+abs(ai), best[i][j].second+abs(aj)};
q.push({-best[ni][nj].first, -best[ni][nj].second, ni, nj});
}
}
}
}
}
}
cout << dist[Gr][Gc] << "\n";
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
344 KB |
Output is correct |
4 |
Correct |
0 ms |
344 KB |
Output is correct |
5 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
1 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
348 KB |
Output is correct |
4 |
Correct |
0 ms |
348 KB |
Output is correct |
5 |
Correct |
0 ms |
348 KB |
Output is correct |
6 |
Correct |
0 ms |
348 KB |
Output is correct |
7 |
Correct |
1 ms |
348 KB |
Output is correct |
8 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
9 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
344 KB |
Output is correct |
4 |
Correct |
0 ms |
344 KB |
Output is correct |
5 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Correct |
0 ms |
344 KB |
Output is correct |
4 |
Correct |
0 ms |
344 KB |
Output is correct |
5 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Correct |
0 ms |
348 KB |
Output is correct |
3 |
Incorrect |
0 ms |
348 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |