推箱子
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

可以将题目简化为二维平面坐标系中,房间是一个边长为30的正方形,以房间的左下角为原点
yuxx和箱子的合法位置应为(p_x,p_y),(b_x,b_y)(1\leq p_x,p_y,b_x,b_y \leq 30 )
yuxx的出发点为(x_1,y_1)yuxx的任务是把箱子移动到目标位置 (x_2,y_2),当前箱子的位置为(x_3,y_3)
房间中有 m 个不可移动的石柱 (石柱的直径很小,只会阻挡所在位置的路径)
石柱的坐标分别为(px_1,py_1)(px_2,py_2)...(px_m,py_m)
yuxx和箱子都必须待在房间内,yuxx只能沿着与x,y轴平行方向移动,当箱子在yuxx的正前方,并且两者相邻的时候才能被推动,此时两者可以同时向前方移动相同的距离。
由于yuxx想当肥宅,不想多走一步路,他想知道完成任务的最短路径是多少。
注:相邻指的是yuxx和箱子的位置为(p_x,p_y),(b_x,b_y)时,
(p_x=b_x \&\& \vert p_y-b_y \vert =1)或者(p_y=b_y \&\& \vert p_x-b_x \vert =1)

输入描述:

第一行六个整数,代表出发点、目标位置和箱子的位置,不同整数间用空格隔开
x_1 y_1 x_2 y_2 x_3 y_3(1\leq x_1,y_1,x_2,y_2,x_3,y_3 \leq 30)
第二行输入一个整数m(0\leq m \leq 200)
接下来m行,每行有两个整数,用空格隔开,表示障碍的坐标(px_i,py_i)(1\leq px_i,py_i \leq 30)
(保证石柱、出发点、目标位置以及箱子的位置之间不会重合,不会出现坐标相同的石柱)

输出描述:

输入一个整数表示需要走的最短路径长度
如果无法到达目标位置,输出-1
示例1

输入

复制
3 3 4 4 5 5
0

输出

复制
9

说明

对于第一个样例,yuxx可以走的最短路径之一是
(4,3),(5,3),(6,3),(6,4),(6,5),(5,5),(5,6),(4,6),(4,5)
此时,对应的箱子位置为
(5,5),(5,5),(5,5),(5,5),(5,5),(4,5),(4,5),(4,5),(4,4)
所以路径长度为9
示例2

输入

复制
3 3 5 5 4 4
2
4 5
5 4

输出

复制
-1