题目描述
题目译自 JOI 2013 Final T3「現代的な屋敷」
你在某个很大的豪宅里迷路了。这个豪宅由东西方向 M 列,南北方向 N 行的正方形房间组成。从西面开始第 x 列 (1≤x≤M) ,从南面开始第 y 行 (1≤y≤N) 的房间用 (x,y) 表示。
相邻的两个房间之间都有一扇门。对于每扇门,门关上表示不可通行,门打开表示可以通行。当门打开时,从门一边的房间走到另一边的房间需要 1 分钟。另外,一些房间中有一个开关,如果连续 1 分钟按住这个开关,那么所有关上的门会打开,所有打开的门会关闭。
现在,连接东西两个房间的门全都是关上的,连接南北两个房间的门全都是打开的。你现在在房间 (1,1) ,要在最短时间内移动到房间 (M,N) 。
任务
给出豪宅的大小 M,N ,以及存在开关的 K 个房间的位置 (X1,Y1),(X2,Y2),…,(XK,YK) 。开始时,连接东西两个房间的门全都是关上的,连接南北的两个房间全都是打开的。请编写程序求出从房间 (1,1) 移动到房间 (M,N) 最少需要多少时间。不过,当房间 (M,N) 不能到达时,请输出 −1 。
输入格式
输入标准如下:
- 第一行为三个以空格分开的整数 M,N,K 。 M 表示东西方向上房间的个数, N 表示南北方向上房间的个数, K 表示存在开关的房间的个数。
- 接下来 K 行中的第 i 行 (1≤i≤K) 为两个以空格分开的整数 Xi,Yi 。表示房间 (Xi,Yi) 中存在开关。这 K 个二元组 (X1,Y1),(X2,Y2),...,(XK,YK) 间彼此相异。
输出格式
输出一行一个整数:表示移动所需的最短时间。如果不能到达房间 (M,N) 则输出 −1 。
3 2 1
1 2
4
对于此样例,可以通过以下的行动来在 4 分钟之内从房间 (1,1) 到达房间 (3,2) 。这是最短用时。
- 移动到房间 (1,2) 。
- 在房间 (1,2) 中按住开关。
- 移动到房间 (2,2) 。
- 移动到房间 (3,2) 。
以上行动可以用下图表示。图中向右为东,向上为北。图中的 × 图案表示你所在的位置, ○ 图案表示开关的位置。

3 2 1
2 1
-1
对于此样例,不能到达房间 (3,2) 。
8 9 15
3 1
3 2
3 7
3 8
1 1
4 5
4 3
5 6
5 8
6 3
6 2
7 5
8 9
8 6
8 5
25
初始状态:

请注意:房间 (1,1) 和房间 (M,N) 中也可能存在开关。
数据范围与提示
对于所有数据,2≤M,N≤105, 1≤K≤2×105, 1≤Xi≤M, 1≤Yi≤N。
| 子任务编号 |
分值 |
附加限制 |
| 1 |
20 |
M,N≤1000 |
| 2 |
30 |
K≤2000 |
| 3 |
50 |
无 |