#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; void Main() { int H,W,N; cin >> H >> W >> N; vector> P(2 * N + 2); P[0] = make_pair(1,1); P[2 * N + 1] = make_pair(H,W); for(int i = 1;i <= N;i++) { int a,b,c,d; cin >> a >> b >> c >> d; P[2 * i - 1] = make_pair(a,b); P[2 * i] = make_pair(c,d); } vector dp(2 * N + 2,(int)2e9); dp[0] = 0; priority_queue> Q; Q.push(make_pair(-0,0)); while(!Q.empty()) { int cur = -Q.top().first; int u = Q.top().second; Q.pop(); if(dp[u] < cur) { continue; } if(u == 0) { for(int v = 1;v <= 2 * N + 1;v++) { int cost = abs(P[u].first - P[v].first) + abs(P[u].second - P[v].second); if(dp[v] > dp[u] + cost) { dp[v] = dp[u] + cost; Q.push(make_pair(-dp[v],v)); } } } else if(u <= 2 * N) { for(int v = 1;v <= 2 * N + 1;v++) { int cost = abs(P[u].first - P[v].first) + abs(P[u].second - P[v].second); if((u & 1) && v == u + 1) { cost = 1; } if(dp[v] > dp[u] + cost) { dp[v] = dp[u] + cost; Q.push(make_pair(-dp[v],v)); } } } else { break; } } cout << dp[2 * N + 1] << "\n"; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int tt = 1; /* cin >> tt; */ while(tt--) Main(); }