/*
Author : N_o_o_B
Created : June 14 2020 17:49:24 
*/
#include <bits/stdc++.h>
using namespace std;
/*
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
*/
#define TRACE
#ifdef TRACE
#define trace(...) { cerr<<"[ "; __trace__(#__VA_ARGS__, __VA_ARGS__);}
#undef endl
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const pair<Arg1,Arg2> &x) {
    return out<<"("<<x.first<<","<<x.second<<")";
}
 
template <typename Arg1>
ostream& operator << (ostream& out, const vector<Arg1> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1>
ostream& operator << (ostream& out, const set<Arg1> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1,typename Arg2>
ostream& operator << (ostream& out, const map<Arg1,Arg2> &a) {
    out<<"[";for(const auto &x:a)out<<x<<",";return out<<"]";
}
 
template <typename Arg1>
void __trace__(const string name, Arg1&& arg1){
    cerr << name << " : " << arg1 << " ] " << endl;
}
 
template <typename Arg1, typename... Args>
void __trace__(const string names, Arg1&& arg1, Args&&... args){
    const string name = names.substr(0,names.find(','));
    cerr<<name<<" : "<<arg1<<" | ";
    __trace__(names.substr(1+(int)name.size()), args...);
}
#else
    #define trace(args...)
#endif
 
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pair<int,int>> vii;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef vector<pair<ll,ll>> vll;
typedef vector<vl> vvl;
//typedef tree<pii, null_type, less<pii>, rb_tree_tag, tree_order_statistics_node_update> oset;
#define fori(i,n) for(int i=0;i<n;i++)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define repd(i,a,b) for(int i=a;i>=b;i--)
#define ford(i,n)  for(int i=n-1;i>=0;i--)
#define trav(x,a) for(auto& x:a)
#define all(x) x.begin(),x.end()
#define pb push_back
#define endl '\n'
#define sz(a) (int)a.size()
#define fi first
#define se second
clock_t time_p=clock();
void time_taken()
{
    time_p=clock()-time_p;
    cerr<<"Time Taken : "<<(float)(time_p)/CLOCKS_PER_SEC<<"\n";
}
//const ll mod=998244353;
const ll mod=1e9+7;
const ll INF=1e18;

const int maxn = 1e6+5;

int nxt[maxn][4];

int dx[4] = {-1,+1,0,0};
int dy[4] = {0,0,-1,+1};

int get(int x,int dir){
    // trace(x);
    if(nxt[x][dir] == x) return x;
    return nxt[x][dir] = get(nxt[x][dir],dir);
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);cout.tie(NULL);
    cout.precision(12);cout << fixed;

    int n,m,k;
    cin >> n >> m >> k;
    int x1,y1,x2,y2;
    cin >> x1 >> y1 >> x2 >> y2;
    x1--;y1--;x2--;y2--;
    vector<string> a(n);
    fori(i,n) cin >> a[i];
    fori(i,4) nxt[maxn-1][i]=maxn-1;
    fori(i,n){
        fori(j,m){
            fori(k,4){
                nxt[i*m + j][k] = (i*m + j);
            }
        }
    }
    queue<int> q;
    q.push(x1*m + y1);
    vl d(n*m,-1);    
    d[x1*m + y1] = 0;
    fori(k,4){
        int i=x1,j=y1;
        int toi=i+dx[k],toj=j+dy[k];
        if(toi >= 0 and toi < n and toj >= 0 and toj < m)
            nxt[i*m + j][k] = (toi*m + toj);
        else nxt[i*m + j][k] = maxn-1;
    }
    while(sz(q)){
        int r = q.front()/m;
        int c = q.front()%m;
        q.pop();
        if(r == x2 and c == y2) break;
        fori(i,4){
            int foo = get(r*m + c,i);
            int tor = foo/m, toc = foo%m;
            while(tor >= 0 and tor < n and toc >= 0 and toc < m and (int)abs(tor-r) + (int)abs(toc-c) <= k and a[tor][toc]!='@'){
                q.push(foo);
                d[foo] = d[r*m + c] + 1;
                fori(k,4){
                    int i=tor,j=toc;
                    int toi=i+dx[k],toj=j+dy[k];
                    if(toi >= 0 and toi < n and toj >= 0 and toj < m)
                        nxt[i*m + j][k] = (toi*m + toj);
                    else nxt[i*m + j][k] = maxn-1;
                }
                foo = get(tor*m + toc,i);
                tor = foo/m,toc = foo%m;
            }
        }
    }

    cout << d[x2*m + y2] << endl;


    time_taken();
    return 0;
}

Measured memory_bytes: 28736