#include<bits/stdc++.h>
#define rep(i, n) for(int i=0; i<n; i++)
#define repo(i, n) for(int i=1; i<=n; i++)
#define INF 1001001001
#define INFll 100100100100100
// debug用
#define PrintVec(x) for (auto elementPrintVec: x) { cout << elementPrintVec << " "; } cout << endl;

using namespace std;
using ull = unsigned long long;
using ll = long long;
using P = pair<int, int>;
const int mod = 1000000007;

int up[4]={0, -1, 0, 1};
int lr[4]={1, 0, -1, 0};

int main(){
  int h, w, k;
  cin >> h >> w >> k;
  int x1, y1, x2, y2;
  cin >> x1 >> y1 >> x2 >> y2;
  x1--; y1--; x2--; y2--;
  vector<string> s(h);
  rep(i, h){
    cin >> s[i];
  }
  queue<P> Q;
  Q.push(P(x1, y1));
  vector<vector<int> > ans(h, vector<int>(w, -1));
  ans[x1][y1]=0;
  while(!Q.empty()){
    P p=Q.front();Q.pop();
    int qx=p.first, qy=p.second;
    rep(i, 4){
      repo(j, k){
        int nx=qx+lr[i]*j, ny=qy+up[i]*j;
        if(nx<0 || nx>=h || ny<0 || ny>=w || s[nx][ny]=='@')break;
        if(ans[nx][ny]!=-1 && ans[nx][ny]<=ans[qx][qy])break;
        if(ans[nx][ny]!=-1)continue;
        ans[nx][ny]=ans[qx][qy]+1;
        Q.push(P(nx, ny));
      }
    }
  }
  cout << ans[x2][y2] << endl;
  return 0;
}
