#include <bits/stdc++.h>
using namespace std;
#define endl '\n'

int n, m, k;
int dir[4][2] = {{2, 2}, {-2, -2}, {2, -2}, {-2, 2}};

void work() 
{
    cin >> n >> m >> k;
   
    vector<vector<bool>> soldier(n + 1, vector<bool>(m + 1, false));
    // 使用 vector<bool> 压缩
    
    for(int i = 0; i < k; i++)
    {
        int x, y;
        cin >> x >> y;
        soldier[x][y] = true;
    }
    
    int x0, y0, xt, yt;
    cin >> x0 >> y0 >> xt >> yt;
    
    // 距离数组,-1表示未访问
    vector<vector<int>> dist(n + 1, vector<int>(m + 1, -1));
    
    queue<pair<int, int>> q;
    dist[x0][y0] = 0;
    q.push({x0, y0});
    
    while(!q.empty())
    {
        auto [x, y] = q.front();
        q.pop();
        
        if(x == xt && y == yt)
        {
            cout << dist[x][y] << endl;
            return;
        }
        
        for(int i = 0; i < 4; i++)
        {
            int nx = x + dir[i][0];
            int ny = y + dir[i][1];
            
            // 检查边界
            if(nx < 1 || nx > n || ny < 1 || ny > m) continue;
            
            // 检查是否已访问
            if(dist[nx][ny] != -1) continue;
            
            // 检查象眼位置是否有兵
            int mid_x = (x + nx) / 2;
            int mid_y = (y + ny) / 2;
            
            if(soldier[mid_x][mid_y]) continue;
            
            dist[nx][ny] = dist[x][y] + 1;
            q.push({nx, ny});
        }
    }
    
    cout << -1 << endl;
}

int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int t = 1;
    while(t--) 
    {
        work();
    }
    return 0;
}