题意:这道题的意思就是,给你N个棋子的坐标,这些棋子的走法是象棋中的马的走法。然后再给你N个坐标终点。
问所有的棋子走到其中一个坐标上,不能有重复,最少的步数是多少。
思路:这道题直接搜显然爆,因为他的坐标范围都是int ,所以我们就要考虑怎么处理出两个点之间的最短步数。
我直接把问题扔给队友了,然后他推出了一条公式,太神不能多说。
问题简化成给你两个点(x , y ) ,(x1 , y1),求这两个点之间最少需要多少步。
然后他经过一系列的数学推导,就搞定了。
过程我也不会,等下看代码。
然后接下来每个棋子到每个终点坐标的距离都处理出来了。
那么根据N = 15 。那么很显然状压DP就可以搞定,求出最小值。
但是考虑到每个棋子只有一个位置,那么很显然棋子和终点位置是二分图,那么很显然我们可以用最小权匹配来搞这个问题。
KM的姿势比状压优美许多。
[cpp] view plaincopyprint?
#include
#include
阅读(273) | 评论(0) | 转发(0) |