#include #include #include using namespace std; using ll = long long; struct point{ ll x, y; ll distance(point q){ return abs(x-q.x)+abs(y-q.y); } }; const ll INF = 1LL<<60; int N; point pos[2010]; ll G[2010][2010]; ll D[2010]; bool visited[2010]; void Dijkstra(int src){ fill(&D[0], &D[0]+2010, INF); fill(&visited[0], &visited[0] + 2010, false); D[src]=0LL; for (int i=0;i<2*N+2;i++) { int u = -1; ll min_dist = INF; for (int j=0;j<2*N+2;j++) { if (!visited[j] && D[j] < min_dist) { min_dist = D[j]; u = j; } } if (u == -1) break; visited[u] = true; for (int v=0;v<2*N+2;v++) { if (!visited[v] && D[u]+G[u][v]>H>>W>>N; pos[0]={1LL, 1LL}, pos[1]={H, W}; for (int i=1;i<=N;i++){ cin>>pos[2*i].x>>pos[2*i].y>>pos[2*i+1].x>>pos[2*i+1].y; } for (int i=0;i<2*N+2;i++){ for (int j=i;j<2*N+2;j++){ G[i][j]=pos[i].distance(pos[j]); G[j][i]=G[i][j]; } } for (int i=1;i<=N;i++) G[2*i][2*i+1]=1; Dijkstra(0); cout << D[1] << "\n"; return 0; }