两个数之间的最短路径问题
題:給定兩個(gè)整數(shù)a和b,這兩個(gè)數(shù)的取值均在【-2000,2000】區(qū)間中。把對(duì)a進(jìn)行一系列操作得到b的過程稱為a到b的路徑,可選操作包括:加12、減12、加7、減7、加5、減5。例如-5至19的的一條路徑為(-5,7,19)。現(xiàn)要求編寫程序,對(duì)任何a和b,求a至b的最短路徑。
可以知道1有 5 5 5 -7 -7組成
f(1) =?5 5 5 -7 -7
求b-a的差值 c
n12 = c/12
n7 = c%12/7
n5 = c%12%7/5
最后剩下要組合的數(shù)就是1 -4之間的數(shù)了
因?yàn)槲覀冎岸际前凑障燃哟髷?shù)的原則,所以在組合1-4之前,路徑都是最短的
4*f(1)就會(huì)出現(xiàn)有8個(gè)-7,然后拿n12個(gè)12去抵消-7得5,這樣就消去兩個(gè)數(shù),增加一個(gè)數(shù),
上面的算法有錯(cuò)誤:
可能出現(xiàn)的組合只能是
12,5(5的數(shù)量要小于12)
12,7(7的數(shù)量要小于12)
5 ,-7(-7的數(shù)量要小于5)
-5, 7(-5的數(shù)量要小于7,要么7個(gè)數(shù)小于5)
http://blog.csdn.net/gogdizzy/article/details/6563626
/** * 用5,7,12加減運(yùn)算,最少步驟到大n * gogdizzy@gmail.com */ #include <stdio.h> #define abs(x) / ( (x^(x>>31))-(x>>31) ) int min_step( int N ) { int diff; int n5, n7, n12; int r5, r7, r12; unsigned tmp, total = unsigned (-1); // assign a very big num for( n5 = -6; n5 < 7; ++n5 ) { diff = N - 5 * n5; n7 = diff / 7; n12 = diff / 12; if( 12 * n12 + 5 * n5 == N ) { tmp = abs( n5 ) + abs( n12 ); if( total > tmp ) r5 = n5, r7 = 0, r12 = n12, total = tmp; } else if( 7 * n7 + 5 * n5 == N ) { if( n7 > -12 && n7 < 12 ) { tmp = abs( n5 ) + abs( n7 ); if( total > tmp ) r5 = n5, r7 = n7, r12 = 0, total = tmp; } } } for( n7 = -11; n7 < 12; ++n7 ) { n12 = ( N - 7 * n7 ) / 12; if( 7 * n7 + 12 * n12 == N ) { tmp = abs( n7 ) + abs( n12 ); if( total > tmp ) r5 = 0, r7 = n7, r12 = n12, total = tmp; } } printf( "%d = (%d) * 5 + (%d) * 7 + (%d) * 12/ntotal:%d/n", N, r5, r7, r12, total ); return total; } int main() { int n; scanf( "%d", &n ); min_step( n ); return 0; }
總結(jié)
以上是生活随笔為你收集整理的两个数之间的最短路径问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hash和trie的对比
- 下一篇: vector简单实现