#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef double ld;
const int INF = 1e10;
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int r,c,n;
cin >> r >> c >> n;
pair<int,int> sP,eP;
cin >> sP.first >> sP.second;
cin >> eP.first >> eP.second;
vector visited(r+2,vector(c+2,false));
vector grid(r+2,vector(c+2,false));
for(int i=0;i<=r+1;i++)visited[i][0]=visited[i][c+1]=true;
for(int i=0;i<=c+1;i++)visited[0][i]=visited[r+1][i]=true;
vector<set<int>> rows(r+1);
vector<set<int>> cols(c+1);
for(int i=1;i<=r;i++) {
for(int j=1;j<=c;j++) {
char a;cin>>a;
rows[i].insert(j);
cols[j].insert(i);
if(a=='#') grid[i][j]=true;
}
}
priority_queue<tuple<int,int,int>> pq;
pq.emplace(0,sP.first,sP.second);
while(!pq.empty()) {
auto [dist,i,j] = pq.top();pq.pop();dist=-dist;
if(visited[i][j])continue;
visited[i][j]=true;
if(make_pair(i,j)==eP) {
cout << dist << '\n';
return 0;
}
// Case 1
if(!visited[i][j+1] and !grid[i][j+1])pq.emplace(-dist,i,j+1);
if(!visited[i][j-1] and !grid[i][j-1])pq.emplace(-dist,i,j-1);
if(!visited[i+1][j] and !grid[i+1][j])pq.emplace(-dist,i+1,j);
if(!visited[i-1][j] and !grid[i-1][j])pq.emplace(-dist,i-1,j);
// Case 2
int absX = abs(i-eP.first);
int absY = abs(j-eP.second);
if(min(absX,absY)<n and max(absX,absY)<=n)pq.emplace(-dist-1,eP.first,eP.second);
// Case 3
// left line
if(j-n>=1)while(true) {
auto iter = cols[j-n].upper_bound(i-n);
if(iter==cols[j-n].end() or *iter>=i+n)break;
pq.emplace(-dist-1,*iter,j-n);
cols[j-n].erase(iter);
}
// right line
if(j+n<=c)while(true) {
auto iter = cols[j+n].upper_bound(i-n);
if(iter==cols[j+n].end() or *iter>=i+n)break;
pq.emplace(-dist-1,*iter,j+n);
cols[j+n].erase(iter);
}
// up line
if(i-n>=1)while(true) {
auto iter = rows[i-n].upper_bound(j-n);
if(iter==rows[i-n].end() or *iter>=j+n)break;
pq.emplace(-dist-1,i-n,*iter);
rows[i-n].erase(iter);
}
// down line
if(i+n<=r)while(true) {
auto iter = rows[i+n].upper_bound(j-n);
if(iter==rows[i+n].end() or *iter>=j+n)break;
pq.emplace(-dist-1,i+n,*iter);
rows[i+n].erase(iter);
}
}
assert(false);
}
# | 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... |