本文主要是介绍D - Okabe and City CodeForces - 821D,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Okabe likes to be able to walk through his city on a path lit by street lamps. That way, he doesn’t get beaten up by schoolchildren.
Okabe’s city is represented by a 2D grid of cells. Rows are numbered from 1 to n from top to bottom, and columns are numbered 1 to m from left to right. Exactly k cells in the city are lit by a street lamp. It’s guaranteed that the top-left cell is lit.
Okabe starts his walk from the top-left cell, and wants to reach the bottom-right cell. Of course, Okabe will only walk on lit cells, and he can only move to adjacent cells in the up, down, left, and right directions. However, Okabe can also temporarily light all the cells in any single row or column at a time if he pays 1 coin, allowing him to walk through some cells not lit initially.
Note that Okabe can only light a single row or column at a time, and has to pay a coin every time he lights a new row or column. To change the row or column that is temporarily lit, he must stand at a cell that is lit initially. Also, once he removes his temporary light from a row or column, all cells in that row/column not initially lit are now not lit.
Help Okabe find the minimum number of coins he needs to pay to complete his walk!
Input
The first line of input contains three space-separated integers n, m, and k (2 ≤ n, m, k ≤ 104).
Each of the next k lines contains two space-separated integers ri and ci (1 ≤ ri ≤ n, 1 ≤ ci ≤ m) — the row and the column of the i-th lit cell.
It is guaranteed that all k lit cells are distinct. It is guaranteed that the top-left cell is lit.
Output
Print the minimum number of coins Okabe needs to pay to complete his walk, or -1 if it’s not possible.
Example
Input
4 4 5
1 1
2 1
2 3
3 3
4 3
Output
2
Input
5 5 4
1 1
2 1
3 1
3 2
Output
-1
Input
2 2 4
1 1
1 2
2 1
2 2
Output
0
Input
5 5 4
1 1
2 2
3 3
4 4
Output
3
Note
In the first sample test, Okabe can take the path , paying only when moving to (2, 3) and (4, 4).
In the fourth sample, Okabe can take the path , paying when moving to (1, 2), (3, 4), and (5, 4).
求最小花费,可以直接上dijkstra求最短路,可以过,然后cxt大爷有一种每一行,每一列都建一个虚拟节点跑SPFA的方法,这是很好的值得借鉴的方法,缩点,对相同性质的点进行缩点。
using namespace std;
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define N 20001
int dis[N];
int minl;
int no;
int n,m,k;
int x[N],y[N];
bool flag=0;
int vis[N];
int main()
{cin>>n>>m>>k;for(int i=1;i<=k;i++){scanf("%d%d",&x[i],&y[i]);if(x[i]==n&&y[i]==m){flag=1;}dis[i]=2e9;}if(!flag){x[++k]=n+1;y[k]=m+1;dis[k]=2e9;}dis[0]=0;x[0]=1;y[0]=1;int pre=0;minl=0;vis[0]=1;for(int i=1;i<=k;i++){minl=2e9;no=0;for(int j=1;j<=k;j++){if(!vis[j]){if(abs(x[pre]-x[j])+abs(y[pre]-y[j])==1) {dis[j]=dis[pre];if(minl>dis[j]){no=j;minl=dis[pre];}}elseif((abs(x[pre]-x[j])<=2||abs(y[pre]-y[j])<=2)){dis[j]=min(dis[j],dis[pre]+1);if(minl>dis[j]){no=j;minl=dis[j];}}else{if(minl>dis[j]){no=j;minl=dis[j];}}}}vis[no]=1;pre=no;}if(dis[k]>1e9){puts("-1");return 0;}{cout<<dis[k]<<endl;}
}
这篇关于D - Okabe and City CodeForces - 821D的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!