#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
 
using namespace __gnu_pbds;
using namespace std;
 
typedef int ll;
typedef unsigned long long int sll;
typedef long double ld;
#define A 1000000007
#define D 100000000000000ll
#define B 998244353ll
#define C 1000000000000000000ll
#define M 4000
#define FAST ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define oset tree<pair<ll,ll>, null_type,less_equal<pair<ll,ll>>, rb_tree_tag,tree_order_statistics_node_update> 
#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define mxe(v) *max_element(v.begin(),v.end())
#define mne(v) *min_element(v.begin(),v.end())
#define bs binary_search
#define lb lower_bound
#define ub upper_bound
#define ve vector
#define br break
#define PI acos(-1)
#define subt cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n" 

int main() 
{
    FAST;
    ll h,w,k,x1,x2,y1,y2;
    cin>>h>>w>>k>>x1>>y1>>x2>>y2;
    x1--;
    x2--;
    y1--;
    y2--;
    string s[h];
    for(int i=0;i<h;i++)
        cin>>s[i];
    ll dis[h][w];
    set<ll> ho[h],vi[w];
    for(int i=0;i<h;i++)
        for(int j=0;j<w;j++)
        {
            dis[i][j]=A;
            ho[i].insert(j);
            vi[j].insert(i);
        }
    dis[x2][y2]=0;
    queue<pair<ll,ll>> q;
    q.push({x2,y2});
    ho[x2].erase(y2);
    vi[y2].erase(x2);
    while (!q.empty()) 
    {
        pair<ll,ll> v = q.front();
        ll a=v.first,b=v.second;
        q.pop();
        ve<ll> vec1;
        for(auto i=ho[a].lb(b);i!=ho[a].end();i++)
        {
            ll v1=(*i);
            if(s[a][v1]=='@')
                break;
            if(k<abs(v1-b))
                break;
            dis[a][v1]=dis[a][b]+1;
            q.push({a,v1});
            vec1.pb(v1);
        }
        for(int i=0;i<vec1.size();i++)
        {
            ho[a].erase(vec1[i]);
            vi[vec1[i]].erase(a);
        }

        ve<ll> vec2;
        for(auto i=ho[a].lb(b);i!=ho[a].begin();)
        {
            i--;
            ll v1=(*i);
            if(s[a][v1]=='@')
                break;
            if(k<abs(v1-b))
                break;
            dis[a][v1]=dis[a][b]+1;
            q.push({a,v1});
            vec2.pb(v1);
        }
        for(int i=0;i<vec2.size();i++)
        {
            ho[a].erase(vec2[i]);
            vi[vec2[i]].erase(a);
        }

        ve<ll> vec3;
        for(auto i=vi[b].lb(a);i!=vi[b].end();i++)
        {
            ll v1=(*i);
            if(s[v1][b]=='@')
                break;
            if(k<abs(v1-a))
                break;
            dis[v1][b]=dis[a][b]+1;
            q.push({v1,b});
            vec3.pb(v1);
        }
        for(int i=0;i<vec3.size();i++)
        {
            vi[b].erase(vec3[i]);
            ho[vec3[i]].erase(b);
        }

        ve<ll> vec4;
        for(auto i=vi[b].lb(a);i!=vi[b].begin();)
        {
            i--;
            ll v1=(*i);
            if(s[v1][b]=='@')
                break;
            if(k<abs(v1-a))
                break;
            dis[v1][b]=dis[a][b]+1;
            q.push({v1,b});
            vec4.pb(v1);
        }
        for(int i=0;i<vec4.size();i++)
        {
            vi[b].erase(vec4[i]);
            ho[vec4[i]].erase(b);
        }
    }
    if(dis[x1][y1]==A)
        cout<<-1;
    else
        cout<<dis[x1][y1];
    subt;
    return 0;
}


Measured memory_bytes: 148672