【2018/10/12测试T2】棋盘问题

本文介绍了一个关于国际象棋的问题,探讨了如何计算国王从初始位置移动到目标坐标所需的最小步数。文章提供了从切比雪夫距离转换成曼哈顿距离的方法,并通过预处理前缀和来优化查询效率,适用于处理大规模数据。

【题目】

传送门

题目描述:

小 O 对国际象棋有着浓厚的兴趣,因为他水平高超,每次人机对战他总是轻松获胜,所 以他决定自己跟自己下国际象棋。

小 O 的棋盘非常大,达到了 1 0 9 10^9 109 ⋅ \cdot 1 0 9 10^9 109,现在他在棋盘上摆放了 n n n 个国王,并对你提出了 q q q 次询问,每次询问指定一个坐标,问将所有国王从初始位置全部移动到这个坐标所需要的最小步数是多少,询问之间相互独立,也就是说每次询问结束后国王会全部回到原来位置。

注意:由于小 O 担心大家无法理解过于高深的规则,所以在本题中,国王之间不会发生相互攻击而且多个国王可以同时处在一个格子中, 国际象棋中国王一步只能移动到与其八连通的格子中。

输入格式:

第一行一个正整数 T 表示数据组数。
对于每组数据,共有 ( n + q + 1 ) (n+q+1) (n+q+1) 行:
第一行两个数字 n , q n,q n,q 分别表示国王数量和询问数量。
接下来 n n n 行,每行两个数字 K x i , K y i K_{xi},K_{yi} Kxi,Kyi 表示国王所在坐标。
接下来 q q q 行,每行两个数字 T x i , T y i T_{xi},T_{yi} Txi,Tyi 表示目标坐标。

输出格式:

对于每组数据,输出共有 q q q 行,每行一个整数表示对应询问的答案。

样例数据:

输入
1
1 1
233 666
666 233

输出
433

备注:

【数据范围】
本题共 7 个测试点,不采用 subtask 评测,但每个测试点分值不同.

数据范围中的 X , Y X,Y X,Y

%matplotlib notebook import numpy as np import math from spatialmath import SE3 from spatialmath.base import e2h, h2e from roboticstoolbox import * from machinevisiontoolbox import CentralCamera cam = CentralCamera(f=[919.21981864*10e-6,913.16565134*10e-6], rho=10e-6, imagesize=[640, 480], pp=[356.41270451,236.9305], name="mycamera") print(cam) P=np.array([-0.18, 0, -0.01]) DFbot1 = DHRobot( [ RevoluteMDH(d=0.04145,qlim=np.array([-np.pi,np.pi])), RevoluteMDH(alpha=np.pi/2,qlim=np.array([-np.pi,np.pi])), RevoluteMDH(a=-0.08285,qlim=np.array([-np.pi,np.pi])), RevoluteMDH(a=-0.08285,qlim=np.array([-np.pi,np.pi])), RevoluteMDH(alpha=-np.pi/2,qlim=np.array([0,np.pi])), RevoluteMDH(a=0.04,d=0.057,qlim=np.array([-np.pi,np.pi])) ], name="DFbot", ) DFbot2 = DHRobot( [ RevoluteMDH(d=0.04145,qlim=np.array([-np.pi/2,np.pi/2])), RevoluteMDH(alpha=np.pi/2,qlim=np.array([-np.pi/2,np.pi/2])), RevoluteMDH(a=-0.08285,qlim=np.array([-np.pi/2,np.pi/2])), RevoluteMDH(a=-0.08285,qlim=np.array([-np.pi/2,np.pi])), RevoluteMDH(alpha=-np.pi/2,d=0.11,qlim=np.array([0,np.pi])) ], name="DFbot", ) #视觉校正 T1=DFbot1.fkine([0,-np.pi/3,np.pi/3,np.pi,0,0]) SE3(T1) DFbot1.plot([0,-np.pi/3,np.pi/3,np.pi,0,0]) #末端摄像机旋转90度 T1=DFbot1.fkine([0,-np.pi/3,np.pi/3,np.pi,0,np.pi/2]) SE3(T1) DFbot1.plot([0,-np.pi/3,np.pi/3,np.pi,0,np.pi/2]) #单一点投影 p = cam.project_point(P, pose=T1 ) cam.plot_point(P, pose=T1 ) #立方体投影 from spatialmath import SE3 from machinevisiontoolbox import mkcube X, Y, Z = mkcube(s=0.03,centre=(-0.165, 0, -0.025), edge=True) cam.plot_wireframe(X, Y, Z,pose=T1) #求解深度 mtx=np.array([[919.21981864, 0. , 356.41270451], [ 0. , 913.16565134, 236.9305 ], [ 0. , 0. , 1. ]]) # 内参矩阵 K = mtx # 位姿矩阵 pose=T1 # 外参矩阵(位姿矩阵的逆) extrinsic = np.linalg.inv(pose) # 3D点(世界坐标系) point_3d = np.array([-0.165, 0, -0.01, 1]) # 将点从世界坐标系转换到相机坐标系 point_camera = extrinsic @ point_3d # 投影到图像平面 point_2d = K @ point_camera[:3] depth=point_2d[2] point_2d /= depth # 归一化 # 内参矩阵 K = mtx # 位姿矩阵 pose=T1 # 外参矩阵(位姿矩阵的逆) extrinsic = np.linalg.inv(pose) # 3D点(世界坐标系) point_3d = np.array([-0.165, 0, -0.01, 1]) # 将点从世界坐标系转换到相机坐标系 point_camera = extrinsic @ point_3d # 投影到图像平面 point_2d = K @ point_camera[:3] depth=point_2d[2] point_2d /= depth # 归一化 point_2d depth xaxis=356.41270451-100 yaxis=226.9298497+50 point_2d=depth*np.array([xaxis,yaxis,1]) point_camera=e2h(np.linalg.inv(K)@point_2d) new_point_3d=np.array(np.linalg.inv(extrinsic)@point_camera) new_point_3d T1 T21=DFbot2.fkine([0,-np.pi/3,np.pi/3,np.pi,0]) T21 T2=np.array(T21) T2[:,-1]=new_point_3d.flatten() #T2[2,-1]=0.01T2 sol = DFbot2.ikine_LM(T2,q0=[0,-np.pi/3,np.pi/3,np.pi,0],ilimit=5000, slimit=5000,joint_limits=True, tol=0.01) sol qt = jtraj([0,-np.pi/3,np.pi/3,np.pi,0],sol.q,100) DFbot2.plot(qt.q,backend='pyplot',movie='pandal.gif') 为每一行写详细的注释,并且说明所有小块都在做什么事?同时写出内置函数的语法。
05-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值