#P1875. Robot

Robot

题目描述

一个用于自动化工厂的机械臂由NN个连接的连杆组成:连杆11连接连杆22,...,连杆N1N-1连接连杆NN。每个连杆都是指定长度的直杆,长度分别为len1len_1, len2len_2, ..., lenNlen_N。每对连接的连杆之间有一个伺服电机:伺服22(连接连杆11和连杆22),...,伺服NN(连接连杆N1N-1和连杆NN),可以激活以调整连接连杆之间的角度。连杆11还通过伺服11连接到工厂地面(在笛卡尔坐标系中的点x=0x=0, y=0y=0, z=0z=0)。最后一个连杆(连杆NN)的自由端有一个"手",用于抓取物体。

在机械臂的初始设置中,每个伺服电机设置为无旋转(00度),机械臂中的连杆与zz轴重合。xyxy平面是水平的(工厂地面),整个机械臂最初垂直向上。从这个初始设置开始,每个伺服电机可以在两个方向中的任意一个方向上旋转最多9090度。伺服11通过绕yy轴旋转使整个机械臂在xzxz平面内移动。伺服22通过绕xx轴旋转使机械臂(除连杆11外)在(可能旋转后的)yzyz平面内移动。类似地,每个奇数编号的伺服电机可以在(可能旋转后的)xzxz平面内旋转机械臂的剩余部分,每个偶数编号的伺服电机可以在(可能旋转后的)yzyz平面内旋转机械臂的剩余部分。实际上,伺服电机绕固定在每个连杆末端的坐标系的yy轴和xx轴旋转连杆。如果我们沿着轴的正半轴看向坐标原点,逆时针旋转会产生正旋转角度。示例数据经过精心选择,以展示这些旋转的效果。

机械臂的最终定位有两个限制:机械臂的任何部分都不能低于工厂地面,并且机械臂中的连杆不能相互交叉(除了它们通过伺服电机连接的地方)。

只需检查机械臂的最终位置。

给定机械臂中的连杆数量、它们的长度以及伺服电机的拟议设置,首先确定机械臂的拟议定位是否允许。如果机械臂可以按拟议方式定位,则计算机器人手的坐标,精确到三位小数。否则,识别第一个(编号最小)设置不当的伺服电机,以及该设置不当的原因。如果连杆之间的距离小于0.0010.001长度单位,则认为它们相交。

输入格式

输入数据包含多个测试用例。每个测试用例按顺序包括连杆数量NN、它们的长度len1len_1, ..., lenNlen_N,以及伺服电机(从伺服11开始)拟议设置的角度。长度和伺服角度为实数,连杆数量为整数。任何机械臂中的连杆数量不超过1010个。最后一个测试用例后跟一个负整数。

输出格式

对于每个测试用例,显示测试用例编号(从11开始)。然后,如果拟议设置允许,显示机器人手在原始(工厂地面)坐标系中的位置(保留三位小数)。否则,显示第一个设置不当的伺服电机的编号及其设置不当的原因。可以接受类似于下面所示的输出格式。

输入数据 1

2 25 15 0 90.0
1 1.0 45.0
2 1 1 0 45
4 1 2 3 4 90 0 0 0
3 1 1 1 0 90 90
2 1 1 45.0 45
4 1 1 1 2 0 90 0 90
8 10 1 1 1 1 1 1 2
   0 0 90 0 90 0 90 0
-1

输出数据 1

Case 1: robot's hand is at (0.000,-15.000,25.000)
Case 2: robot's hand is at (0.707,0.000,0.707)
Case 3: robot's hand is at (0.000,-0.707,1.707)
Case 4: robot's hand is at (10.000,0.000,0.000)
Case 5: robot's hand is at (1.000,-1.000,1.000)
Case 6: robot's hand is at (1.207,-0.707,1.207)
Case 7: servo 4 attempts to move arm below floor
Case 8: servo 8 causes link collision