#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
using namespace std;
using P=pair<int,int>;
vector<P> edge={P(1,0),P(-1,0),P(0,1),P(0,-1)};
int H,W,K,gx,gy;
P st;
bool ch(int a,int b){
  return !(a>=0&b>=0&a<H&b<W);
}
int main(){
  cin>>H>>W>>K>>st.first>>st.second>>gx>>gy;
  vector<vector<int>> dist(H,vector<int>(W));
  for(int i=0;i<H;++i){
    string s;
    cin>>s;
    for(int j=0;j<W;++j){
      dist[i][j]=(s[j]=='.')*1e6;
    }
  }
  queue<P> que;
  dist[--st.first][--st.second]=0;
  que.push(st);
  while(!que.empty()){
    P x=que.front();que.pop();
    for(auto d:edge){
      for(int i=1;i<=K;++i){
        int a=x.first+d.first*i,b=x.second+d.second*i;
        if(ch(a,b)||dist[a][b]<=dist[x.first][x.second])break;
        if(dist[a][b]!=dist[x.first][x.second]+1){
          que.push(P(a,b));
          dist[a][b]=dist[x.first][x.second]+1;
        }
      }
    }
  }
  cout<<((dist[--gx][--gy]==1e6)?-1:dist[gx][gy])<<endl;
}