求两个整数之间的最短路径问题

题目描述:

给定两个整数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;
}

 

 

 

posted @ 2012-05-30 10:46  CobbLiu  阅读(389)  评论(0编辑  收藏  举报