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

typedef long long ll;
typedef pair<int, pair<int, int>> piii;
//loop
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= (ll)(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= (ll)(b); i--)
//STL
#define ALL(x) (x).begin(), (x).end()
#define SIZE(x) ((ll)(x).size())
#define MAX(x) *max_element(ALL(x))
#define MIN(x) *min_element(ALL(x))

//const
#define MOD 1000000007 //10^9+7:合同式の法

//acronym
#define PB push_back //vectorヘの挿入
#define MP make_pair //pairのコンストラクタ
#define F first      //pairの一つ目の要素
#define S second     //pairの二つ目の要素

struct Node
{
    // 状態 (座標、向いている方向)
    pair<int, int> coord;
    int dir;
    bool lotus = false;

    // ダイクストラ法用のデータ
    bool done;
    double cost;
};

const int INF = 1e9;
int H, W, K;

bool valid(int x, int y)
{
    return (x >= 0 && x < H && y >= 0 && y < W);
}

void Main()
{
    cin >> H >> W >> K;
    int x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    // 0始まりとする
    x1--;
    y1--;
    x2--;
    y2--;

    // 各方角での移動量 (0: 北, 1: 南, 2: 西, 3: 東)
    int dx[] = {1, -1, 0, 0};
    int dy[] = {0, 0, -1, 1};

    // グリッド読み込み
    vector<string> grid(H);
    REP(i, H)
    {
        cin >> grid.at(i);
    }

    // 各グリッドへの到達可能な最短水かき回数
    vector<vector<int>> scores(H, vector<int>(W, INF));

    priority_queue<piii, vector<piii>, greater<piii>> que;
    que.push(MP(0, MP(x1, y1)));
    while (!que.empty())
    {
        // 最短経路を取得
        piii p = que.top();
        que.pop();
        // ここまでの最短水かき回数
        int score = p.first;
        // 現在の座標
        int x = p.second.first, y = p.second.second;

        // ゴールについていれば、距離を出力して終了
        if (x == x2 && y == y2)
        {
            cout << score << endl;
            return;
        }

        // 各方角で、各座標毎の距離を算出
        REP(i, 4)
        {
            FOR(d, 1, K)
            {
                // 移動先の座標
                int nx = x + dx[i] * d;
                int ny = y + dy[i] * d;

                // グリッドの範囲内かつ移動可能かチェック
                // 移動不可能の場合、それ以上進めない。故にこの方角での探索を終了する
                if (!valid(nx, ny))
                {
                    break;
                }
                if (grid.at(nx).at(ny) == '@')
                {
                    break;
                }

                // 計算済みの最短水かき回数より少ない回数で移動できるとき
                if (scores.at(nx).at(ny) > score + 1)
                {
                    // 最短水かき回数を更新
                    scores.at(nx).at(ny) = score + 1;
                    // 次点での最短水かき回数候補に追加
                    que.push(MP(score + 1, MP(nx, ny)));
                }
                // 計算済みの最短水かき回数と同一ならば、さらに移動して探索続行
                else if (scores.at(nx).at(ny) == score + 1)
                {
                    continue;
                }
                // 計算済みの最短水かき回数よりも、必要な水かき回数が多い場合は探索終了。
                // なぜならば、以降の移動経路では最短水かき回数とはなり得ないため。
                else
                {
                    break;
                }
            }
        }
    }

    // ゴールへとたどり着けない場合
    cout << -1 << endl;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    Main();
    return 0;
}


Measured memory_bytes: 12180