📜  门|门CS 2011 |问题 29(1)

📅  最后修改于: 2023-12-03 14:58:37.279000             🧑  作者: Mango

题目描述

在一个二维平面上,有n个门,每个门有一个开口和一个门板。 这些门的开口彼此不重叠,也不与平面边界重叠。每个门板都是n-1个边缘互不重叠的小三角形构成的。如图所示,这些三角形可以按任意方向旋转,但不可以缩放或拉伸。

image

现在有一个机器人可以在平面上跑, 机器人必须携带一个门板,并且这个门板要能够准确覆盖到其中的一个门。

机器人可以沿x、y方向移动(抱歉,机器人不能斜着走),并可以随意旋转门板。 机器人不能穿过平面上的门,也不能把门给顶开。 机器人的目标是,从平面上某个位置出发,通过一系列行动到达某个确定的门,并且所携带的门板最终可以准确覆盖到该门。

请问,最少要依次移动多少个格子,才能完成机器人的目标?

输入格式

第一行是整数n(5≤n≤100)。

接下来n行,每行按照逆时针方向给出一个门的开口。

每行第一个整数si(3≤si)表示该门有si个点(si-2)个三角形。

接下来si个整数表示该门从上一个点连接到当前点的距离di(1≤di≤500)。

其中,任意两个点之间的距离不超过2000。

输出格式

输出一个整数,表示机器人从起点开始进行一系列行动,最少需要移动的格子数。

输入样例
5
4 1 1 3 2
4 1 2 2 1
3 1 3 2
4 1 4 2 1
4 2 4 3 1
输出样例
25
解题思路

这道题是一道比较难的几何问题,要求出机器人从起点到达目标门的最短路径。由于机器人不能穿过平面上的门,因此我们可以考虑构建一个离散化图,每一格代表平面上的一个点,而两个不同的格子之间的连线只能在两个门之间,并且不能穿过门。

因此我们可以先对所有门进行编号,然后找到它们之间的连通情况并进行标记。由于已知的信息只有门的开口而没有門板的具体形状,因此我们需要对每个门进行枚举,找到其可能处于的所有姿态。经过试探可以发现,门板共有n(n-1)种,其中,n是指门的个数。对于每一种可能的门板,我们都需要检查它是否会与其他门重叠,并根据其与目标门距离的远近来更新最短路径。

最后,我们可以将所有的门与其对应的姿态及最短路径存储在网格图中,使用BFS搜索算法求解最短路径。在搜索过程中,我们需要将当前门的信息以及机器人所处的位置压成一个状态,并检查下一个门能否到达。

时间复杂度:O(n^4 *logn),其中,logn是用于排序的快速排序算法的时间复杂度。