//#pragma GCC target("avx2")
//#pragma GCC optimize("O3")
 
//#include <x86intrin.h>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <bitset> 
#include <vector>
#include <cmath>
#include <deque>
#include <queue>
#include <iomanip>
#include <stack>
#include <map>
#include <set>
//#include <ordered_set>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
 
//using namespace __gnu_pbds;
using namespace std;
 
//template<typename T> using ordered_set = tree <T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
     
#define F first
#define S second           
#define lb lower_bound               
#define ub upper_bound
#define pb push_back
#define pf push_front    
#define ppb pop_back
#define mp make_pair                                     
#define bpp __builtin_popcountll                                                                                        
#define sqr(x) ((x) * (x)) 
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define in insert
#define ppf pop_front
#define endl '\n'
//#define int long long
 
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
typedef pair <int, int> pii;
 
const int mod = (int)1e9 + 7;
const int N = (int)3e5 + 123;
const ll inf = (ll)1e18 + 1;
 
const double pi = acos (-1.0);
const double eps = 1e-9;                  
const int dx[] = {0, 0, 1, 0, -1};
const int dy[] = {0, 1, 0, -1, 0};

int n, m, k, sx, sy, fx, fy;
queue < pair <pii, int> > q;
vector <pii> v;

inline void boost () {
   ios_base :: sync_with_stdio (0);
   cin.tie (0), cout.tie (0);
}
 
inline void Solve () {
   cin >> n >> m >> k;
   cin >> sx >> sy >> fx >> fy;
   sx --, sy --, fx --, fy --;
   char a[n][m];
   pii ans[n][m][5];
   for (int i = 0; i < n; i ++) {
      for (int j = 0; j < m; j ++)
         cin >> a[i][j], ans[i][j][1] = ans[i][j][2] = ans[i][j][3] = ans[i][j][4] = mp (mod, mod);
   }
   ans[sx][sy][1] = ans[sx][sy][2] = ans[sx][sy][3] = ans[sx][sy][4] = mp (0, k);
   for (int i = 1; i <= 4; i ++) q.push ({ {sx, sy}, i});
   while (sz (q)) {
      int x = q.front ().F.F, y = q.front ().F.S, tp = q.front ().S;
      q.pop ();
      for (int i = 1; i <= 4; i ++) {
         int new_x = x + dx[i], new_y = y + dy[i];
         if (new_x < 0 || new_y < 0 || new_x >= n || new_y >= m || a[new_x][new_y] == '@') continue;
         int val1, val2; 
         if (i == tp) val1 = ans[x][y][tp].F + (ans[x][y][tp].S == k), val2 = (ans[x][y][tp].S == k ? 1 : ans[x][y][tp].S + 1);
         else val1 = ans[x][y][tp].F + 1, val2 = 1;
         if (ans[new_x][new_y][i] > mp (val1, val2)) {
            ans[new_x][new_y][i] = mp (val1, val2);
            q.push ({ {new_x, new_y}, i});
         }
      }            
   }              
   int res = min (ans[fx][fy][1].F, min (ans[fx][fy][2].F, min (ans[fx][fy][3].F, ans[fx][fy][4].F)));   
   if (res == mod) res = -1;
   cout << res;
}
 
signed main () {                                       
   #ifdef QWERTY
      freopen("input", "r", stdin);
   #endif
// freopen (".in", "r", stdin);    
// freopen (".out", "w", stdout);              
   boost ();
   int tt = 1;
   //cin >> tt;   
   while (tt --) {
      Solve ();
   }                                               
   return 0;      
}                   

Measured memory_bytes: 43700