求两个整数之间的最短路径问题
题目描述:
给定两个整数a和b,这两个数的取值均在【-2000,2000】区间中。把对a进行一系列操作得到b的过程称为a到b的路径,可选操作包括:加12、减 12、加7、减7、加5、减5。例如-5至19的的一条路径为(-5,7,19)。现要求编写程序,对任何a和b,求a至b的最短路径。
本题题意实际上就是a-b=x1*5+x2*7+x3*12,求|x1|+|x2|+|x3|的最小值。那么我们可不可以找出x1 x2 x3的取值范围,然后暴力呢?
假设现在求得|x1|>=7,那他可不可能是最优解呢?当然不能,因为完全可以把x1%7分给x2嘛,这样是结果等价但是求得的值更小了,比如x1=8 那么我们完全可以让x1=1 ,x2=x2+1 这样也是一个解而且得到的结果更好了!同理,x2也不能超过11,不然给12就是了,于是就可以直接暴力解决了,循环-6<=x1<=6 -11<=x2<=11
于是就可以这么写
int solve(int a, int b) { int res = 0x7fffffff; for (int x = -6; x <= 6; ++x) for (int y = -11; y <= 11; ++y) { if (((b - a) - 5 * x - 7 * y) % 12 == 0) { int z = ((b - a) - 5 * x - 7 * y) / 12; res = min(res, abs(x) + abs(y) + abs(z)); } } return res; }