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

inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}

typedef long long ll;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<long long> VL;
typedef vector<vector<long long>> VVL;
typedef vector<string> VS;
typedef pair<int, int> P;
typedef tuple<int,int,int> tpl;

#define ALL(a)  (a).begin(),(a).end()
#define SORT(c) sort((c).begin(),(c).end())
#define REVERSE(c) reverse((c).begin(),(c).end())
#define EXIST(m,v) (m).find((v)) != (m).end()
#define LB(a,x) lower_bound((a).begin(), (a).end(), x) - (a).begin()
#define UB(a,x) upper_bound((a).begin(), (a).end(), x) - (a).begin()

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)
#define RFOR(i,a,b) for(int i=(a)-1;i>=(b);--i)
#define RREP(i,n) RFOR(i,n,0)

#define en "\n"

constexpr double EPS = 1e-9;
constexpr double PI  = 3.1415926535897932;
constexpr int INF = 2147483647;
constexpr long long LINF = 1LL<<60;
constexpr long long MOD = 1000000007; // 998244353;

#define dump(x)  cerr << #x << " = " << (x) << endl;
#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl;

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }

void Main(){
    int H,W,K; cin >> H >> W >> K;
    VI x(4); REP(i,4){cin >> x[i];}
    char c[H+2][W+2]; REP(i,H)REP(j,W) cin >> c[i+1][j+1];

    REP(i,H+2){
        c[i][0] = '@';
        c[i][W+1] = '@';
    }
    REP(i,W+2){
        c[0][i] = '@';
        c[H+1][i] = '@';
    }

    int d[H+2][W+2]; REP(i,H+2)REP(j,W+2) d[i][j] = INF;
    d[x[0]][x[1]] = 0;

    set<int> sx[H+2],sy[W+2];
    REP(i,H+2)REP(j,W+2){
        sx[i].insert(j);
        sy[j].insert(i);
    }
    sx[x[0]].erase(x[1]);
    sy[x[1]].erase(x[0]);
    H += 2;
    W += 2;

    queue<int> q; q.emplace(x[0]*W+x[1]);
    while(!q.empty()){
        int loc = q.front(); q.pop();
        int s = loc/W, t = loc%W;
        int cost = d[s][t];

        auto it = sx[s].lower_bound(t);
        while(c[s][*it]!='@' && (*it)-t<=K){
            int i = *it;
            chmin(d[s][i], cost+1);
            q.emplace(s*W+i);
            sy[i].erase(s);
            sx[s].erase(it++);
        }

        it = sx[s].lower_bound(t);
        it--;
        while(c[s][*it]!='@' && t-(*it)<=K){
            int i = *it;
            chmin(d[s][i], cost+1);
            q.emplace(s*W+i);
            sy[i].erase(s);
            sx[s].erase(it--);
        }
        
        it = sy[t].lower_bound(s);
        while(c[*it][t]!='@' && (*it)-s<=K){
            int i = *it;
            chmin(d[i][t], cost+1);
            q.emplace(i*W+t);
            sx[i].erase(t);
            sy[t].erase(it++);
        }

        it = sy[t].lower_bound(s);
        it--;
        while(c[*it][t]!='@' && s-(*it)<=K){
            int i = *it;
            chmin(d[i][t], cost+1);
            q.emplace(i*W+t);
            sx[i].erase(t);
            sy[t].erase(it--);
        }
    }

    int ans = d[x[2]][x[3]]<INF ? d[x[2]][x[3]] : -1;
    cout << ans << en;
    return;
}

int main(void){
    cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(0);cout<<fixed<<setprecision(15);
    int t=1; //cin>>t;
    REP(_,t) Main();
    return 0;
}

Measured memory_bytes: 346432