#include <bits/stdc++.h>
#define L(i,j,k) for(int i=(j);i<=(k);i++)
#define R(i,j,k) for(int i=(j);i>=(k);i--)
#define all(x) x.begin(),x.end()
#define sz(a) ((int)a.size())
#define pb push_back
using namespace std;
typedef long long ll;
const int N=3000,INF=1e9;
const int di[]={1,-1,0,0};
const int dj[]={0,0,1,-1};
vector<string>A;
void chmin(int &a,int b){
a=min(a,b);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int r,c,n;cin>>r>>c>>n;
int sr,sc,gr,gc;cin>>sr>>sc>>gr>>gc;
sr--,sc--,gr--,gc--;
A.resize(r);
L(i,0,r-1){
cin>>A[i];
}
auto safe=[&](int x,int y)->bool{
return x>=0&&x<r&&y>=0&&y<c;
};
vector<vector<int>>dist(r,vector<int>(c,INF));
deque<tuple<int,int,int>>q;
q.pb({sr,sc,0});
dist[sr][sc]=0;
while(sz(q)){
auto [i,j,d]=q.front();q.pop_front();
if(d!=dist[i][j])continue;
//primer caso
L(k,0,3){
int ni=i+di[k],nj=j+dj[k];
if(safe(ni,nj)&&A[ni][nj]!='#'){
if(dist[ni][nj]>dist[i][j]){
dist[ni][nj]=dist[i][j];
q.push_front({ni,nj,d});
}
}
}
//segundo caso
L(ni,i-n,i+n){
L(nj,j-n,j+n){
if(safe(ni,nj)){
if((ni==i+n||ni==i-n)&&(nj==j-n||nj==j+n))continue;
if(dist[ni][nj]>dist[i][j]){
dist[ni][nj]=dist[i][j]+1;
}
}
}
}
L(ni,max(0,i-n),min(r-1,i+n)){
q.push_back({ni,max(0,j-n),d+1});
q.push_back({ni,min(j+n,c-1),d+1});
}
L(nj,max(0,j-n),min(c-1,j+n)){
q.push_back({min(r-1,i+n),nj,d+1});
q.push_back({max(0,i-n),nj,d+1});
}
}
cout<<dist[gr][gc]<<endl;
}