#include <iostream>
#include <queue>
#include <vector>
#define PII pair<int,int>
#define x first
#define y second
using namespace std;

int main() {
    int n, m, k;
    cin >> n >> m >> k;
    // 0:未访问或者步数为0
    // -1:有兵
    // other:到该坐标的最小步数
    vector<vector<int>> map(n + 1, vector<int>(m + 1, 0));

    while (k--) {
        int x, y;
        cin >> x >> y;
        // 将兵的位置标记为-1
        map[x][y] = -1;
    }
    int x0, y0, xt, yt;
    cin >> x0 >> y0 >> xt >> yt;

    // 目标不在田字格顶点上
    if ((abs(x0 - xt) % 2 != 0 || abs(y0 - yt) % 2 != 0) || (x0 == xt &&
            abs(xt - x0) % 4 != 0) || (y0 == yt && abs(yt - y0) % 4 != 0)) {
        cout << -1 << endl;
        return 0;
    }

    queue<PII> qu;
    qu.push({x0, y0});
    while (!qu.empty()) {
        PII cur = qu.front();
        qu.pop();

        int dx[4] = {+2, -2, +2, -2};
        int dy[4] = {-2, +2, +2, -2};
        int dcx[4] = {+1, -1, +1, -1};
        int dcy[4] = {-1, +1, +1, -1};
        for (int i = 0; i < 4; i++) {
            // 范围检测
            if (cur.x + dx[i] < 1 || cur.y + dy[i] < 1 || cur.x + dx[i] > n ||
                    cur.y + dy[i] > m) {
                continue;
            }
            // 路上没有障碍且目标未访问
            if (map[cur.x + dcx[i]][cur.y + dcy[i]] != -1 &&
                    map[cur.x + dx[i]][cur.y + dy[i]] <= 0) {
                qu.push({cur.x + dx[i], cur.y + dy[i]});
                map[cur.x + dx[i]][cur.y + dy[i]] = map[cur.x][cur.y] + 1;
                // 到达目标点,终止循环
                if (cur.x + dx[i] == xt && cur.y + dy[i] == yt) {
                    while (!qu.empty()) {
                        qu.pop();
                    }
                    break;
                }
            }
        }
    }
    // 如果步数为0,表示无法到达。
    cout << (map[xt][yt] == 0 ? -1 : map[xt][yt]) << endl;
}