#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ld long double
#define show(x,y) cout << y << " " << #x << endl;
#define show2(x,y,i,j) cout << y << " " << #x << " " << j << " " << #i << endl;
#define show3(x,y,i,j,p,q) cout << y << " " << #x << " " << j << " " << #i << " " << q << " " << #p << endl;
#define show4(x,y) for(auto it:y) cout << it << " "; cout << #x << endl;
typedef pair<int,int>pii;
typedef pair<pii,int>pi2;
mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count());
void solve(){
int n,m,k;
cin >> n >> m >> k;
pii st;
pii ed;
cin >> st.first >> st.second >> ed.first >> ed.second;
st.first--;
st.second--;
ed.first--;
ed.second--;
string arr[n];
for(int x=0;x<n;x++){
cin >> arr[x];
}
pii dir[8]={
{1,0},
{-1,0},
{0,1},
{0,-1},
{1,1},
{-1,-1},
{1,-1},
{-1,1},
};
int dist[n+5][m+5];
int ans[n+5][m+5];
memset(dist,-1,sizeof(dist));
memset(ans,-1,sizeof(ans));
vector<pii>black;
vector<pii>white;
white.push_back(st);
for(int x=0;x<n+m+2;x++){
//bfs out
if(x>0){
queue<pii>q;
for(auto it:black){
if(ans[it.first][it.second]!=-1) continue;
q.push(it);
dist[it.first][it.second]=0;
}
black.clear();
while(!q.empty()){
pii cur=q.front();
q.pop();
if(ans[cur.first][cur.second]!=-1) continue;
ans[cur.first][cur.second]=x;
for(auto it:dir){
int nx=cur.first+it.first;
int ny=cur.second+it.second;
int nd=dist[cur.first][cur.second]+1;
if(nx<0||ny<0||nx>=n||ny>=m) continue;
if(dist[nx][ny]!=-1&&dist[nx][ny]<=nd) continue;
if(ans[nx][ny]!=-1) continue;
if(nd>=k){
if(abs(it.first)+abs(it.second)==1){
if(arr[nx][ny]=='.') white.push_back({nx,ny});
else black.push_back({nx,ny});
}
continue;
}
dist[nx][ny]=nd;
q.push({nx,ny});
}
}
}
//white
{
queue<pii>q;
for(auto it:white){
if(ans[it.first][it.second]!=-1) continue;
q.push(it);
}
white.clear();
while(!q.empty()){
pii cur=q.front();
q.pop();
if(ans[cur.first][cur.second]!=-1) continue;
ans[cur.first][cur.second]=x;
for(auto it:dir){
if(abs(it.first)+abs(it.second)!=1) continue;
int nx=cur.first+it.first;
int ny=cur.second+it.second;
if(nx<0||ny<0||nx>=n||ny>=m) continue;
if(ans[nx][ny]!=-1) continue;
if(arr[nx][ny]=='.'){
q.push({nx,ny});
}
else{
black.push_back({nx,ny});
}
}
}
}
}
cout << ans[ed.first][ed.second] << "\n";
}
int32_t main(){
ios::sync_with_stdio(0);
cin.tie(0);
//freopen("in.txt","r",stdin);
//freopen("in.txt","w",stdout);
int t=1;
//cin >> t;
while(t--){
solve();
}
}
# | 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... |