// includes
#include <bits/stdc++.h>
using namespace std;

// macros
#define pb emplace_back
#define mk make_pair
#define FOR(i, a, b) for(int i=(a);i<(b);++i)
#define rep(i, n) FOR(i, 0, n)
#define rrep(i, n) for(int i=((int)(n)-1);i>=0;i--)
#define irep(itr, st) for(auto itr = (st).begin(); itr != (st).end(); ++itr)
#define irrep(itr, st) for(auto itr = (st).rbegin(); itr != (st).rend(); ++itr)
#define whole(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define bit(n) (1LL<<(n))
#define F first
#define S second
// functions
template <typename T> void unique(T& c){c.erase(std::unique(c.begin(), c.end()), c.end());}
template <class T>bool chmax(T &a, const T &b){if(a < b){a = b; return 1;} return 0;}
template <class T>bool chmin(T &a, const T &b){if(a > b){a = b; return 1;} return 0;}
template <typename T> istream &operator>>(istream &is, vector<T> &vec){for(auto &v: vec)is >> v; return is;}
template <typename T> ostream &operator<<(ostream &os, const vector<T>& vec){for(int i = 0; i < vec.size(); i++){ os << vec[i]; if(i + 1 != vec.size())os << " ";} return os;}
template <typename T> ostream &operator<<(ostream &os, const set<T>& st){for(auto itr = st.begin(); itr != st.end(); ++itr){ os << *itr; auto titr = itr; if(++titr != st.end())os << " ";} return os;}
template <typename T> ostream &operator<<(ostream &os, const unordered_set<T>& st){for(auto itr = st.begin(); itr != st.end(); ++itr){ os << *itr; auto titr = itr; if(++titr != st.end())os << " ";} return os;}
template <typename T> ostream &operator<<(ostream &os, const multiset<T>& st){for(auto itr = st.begin(); itr != st.end(); ++itr){ os << *itr; auto titr = itr; if(++titr != st.end())os << " ";} return os;}
template <typename T> ostream &operator<<(ostream &os, const unordered_multiset<T>& st){for(auto itr = st.begin(); itr != st.end(); ++itr){ os << *itr; auto titr = itr; if(++titr != st.end())os << " ";} return os;}
template <typename T1, typename T2> ostream &operator<<(ostream &os, const pair<T1, T2> &p){os << "(" << p.first << ", " << p.second << ")"; return os;}
template <typename T1, typename T2> ostream &operator<<(ostream &os, const map<T1, T2> &mp){for(auto itr = mp.begin(); itr != mp.end(); ++itr){ os << "(" << itr->first << ", " << itr->second << ")"; auto titr = itr; if(++titr != mp.end())os << " "; } return os;}
template <typename T1, typename T2> ostream &operator<<(ostream &os, const unordered_map<T1, T2> &mp){for(auto itr = mp.begin(); itr != mp.end(); ++itr){ os << "(" << itr->first << ", " << itr->second << ")"; auto titr = itr; if(++titr != mp.end())os << " "; } return os;}
//  types
using ll = long long int;
using P = pair<int, int>;
// constants
const int inf = 1e9;
const ll linf = 1LL << 60;
const double EPS = 1e-10;
const int mod = 1000000007;
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, -1, 0, 1};
// io
struct fast_io{
  fast_io(){ios_base::sync_with_stdio(false); cin.tie(nullptr); cout << fixed << setprecision(20);}
} fast_io_;

int xs, ys, xg, yg;

int main(int argc, char const* argv[])
{
  int h, w, k; cin >> h >> w >> k;
  cin >> xs >> ys >> xg >> yg; xs--; ys--; xg--; yg--;
  vector<string> s(h); cin >> s;
  vector<set<int>> row(h), col(w);
  vector<vector<int>> ans(h, vector<int>(w, inf));
  vector<vector<int>> ri(h, vector<int>(w, w));
  vector<vector<int>> le(h, vector<int>(w, -1));
  vector<vector<int>> to(h, vector<int>(w, -1));
  vector<vector<int>> bo(h, vector<int>(w, h));

  rep(i, h){
    rep(j, w){
      if(s[i][j] == '@'){
        le[i][j] = j;
        to[i][j] = i;
      }else{
        if(i > 0)to[i][j] = to[i-1][j];
        if(j > 0)le[i][j] = le[i][j-1];
      }
    }
  }

  rrep(i, h){
    rrep(j, w){
      if(s[i][j] == '@'){
        ri[i][j] = j;
        bo[i][j] = i;
      }else{
        if(i + 1 < h)bo[i][j] = bo[i+1][j];
        if(j + 1 < w)ri[i][j] = ri[i][j+1];
      }
    }
  }

  rep(i, h){
    rep(j, w){
      if(s[i][j] != '@'){
        row[i].insert(j);
        col[j].insert(i);
      }
    }
  }
  ans[xs][ys] = 0;
  row[xs].erase(ys);
  col[ys].erase(xs);
  queue<P> q; q.push(mk(xs, ys));
  while(!q.empty()){
    int i, j;
    tie(i, j) = q.front(); q.pop();
    // right
    if(sz(row[i])){
      int rb = min({w, ri[i][j], j + k + 1});
      auto itr = row[i].upper_bound(j);
      while(itr != row[i].end() && *itr < rb){
        int nex = *itr;
        ans[i][nex] = ans[i][j] + 1;
        q.push(mk(i, nex));
        col[nex].erase(i);
        itr = row[i].erase(itr);
      }
    }
    // left
    if(sz(row[i])){
      int lb = max({0, le[i][j] + 1, j - k});
      auto itr = row[i].lower_bound(lb);
      while(itr != row[i].end() && *itr < j){
        int nex = *itr;
        ans[i][nex] = ans[i][j] + 1;
        q.push(mk(i, nex));
        col[nex].erase(i);
        itr = row[i].erase(itr);
      }
    }
    // top
    if(sz(col[j])){
      int tb = max({0, to[i][j] + 1, i - k});
      auto itr = col[j].lower_bound(tb);
      while(itr != col[j].end() && *itr < i){
        int nex = *itr;
        ans[nex][j] = ans[i][j] + 1;
        q.push(mk(nex, j));
        row[nex].erase(j);
        itr = col[j].erase(itr);
      }
    }
    // bottom
    if(sz(col[j])){
      int bb = min({h, bo[i][j], i + k + 1});
      auto itr = col[j].upper_bound(i);
      while(itr != col[j].end() && *itr < bb){
        int nex = *itr;
        ans[nex][j] = ans[i][j] + 1;
        q.push(mk(nex, j));
        row[nex].erase(j);
        itr = col[j].erase(itr);
      }
    }
  }

  cout << (ans[xg][yg] == inf ? -1: ans[xg][yg]) << endl;
  return 0;
}


Measured memory_bytes: 163924