HDU2064:
假设 f[ n ]是n块圆盘移动的次数。移动的时候有以下四个步骤:
- 第n块以上的 n-1块圆盘从 A柱 借助 B柱 移动到 C柱 ,移动的次数为f[ n -1 ]次。
- 第n块圆盘从 A柱 移动到 B柱 ,移动次数为 1。
- n-1块圆盘借助 B柱 (虽然第n块圆盘在B柱上,但他是最大的圆盘,n-1块中的所有圆盘都可放在他的上面,因此B柱也能看成空柱) 移动到 A柱,此时移动的次数和第一次一样,也是 f[ n - 1 ]次(因为两次都是移动n-1块圆盘,而且都是从一个柱借助一个柱移动到另一个柱上,而且是从最左(右)边的柱移动到最右(左)边的柱)。
- 第n块从 B柱 移动到 C柱。
- n-1块圆盘借助 B柱 移动到 C柱上,与第1,3次同理,也是移动了f[ n - 1 ]次。
所以得出结论:f[ n ] = 3 * f[ n - 1 ] + 2
附上AC代码:
#include<stdio.h>
int main( void )
{
int i , n ;
__int64 f [ 36 ] ;
f [ 1 ] = 2 ;
for( i = 2 ; i < 36 ; i++ )
f [ i ] = 3 * f [ i - 1 ] + 2 ;
while( scanf( "%d" , &n ) != EOF )
printf( "%I64d\n" , f [ n ] ) ;
return 0 ;
}
移动次数到后面会大的离谱,记得要用long long类型。
=====================================================================================================
HDU2077:
有了HDU2064的基础后,再理解这题就会比较轻松。
设g[ n ]为n块圆盘移动的次数,移动的时候有以下步骤:
- 第n块以上的n-1块圆盘借助 C柱 移动到 B柱,移动g[ n - 1 ]次
- 第n块直接从 A柱 移动到 C柱,移动两次
- n-1块再从 B柱 借助 C柱 移动到 A柱,移动g[ n - 1 ]次
得出结论:g[ n ] = f[ n - 1 ] + 2 (因为第1,3步合起来就可看成把前n-1块圆盘移到了 C柱。)
AC代码:
#include<stdio.h>
int main( void )
{
int T , i , n ;
__int64 f [ 21 ] ;
f [ 0 ] = 0 ;
f [ 1 ] = 2 ;
for ( i = 2 ; i < 21 ; i++ )
f [ i ] = 3 * f [ i - 1 ] + 2 ;
scanf( "%d" , &T ) ;
while( T-- )
{
scanf( "%d" , &n ) ;
printf( "%I64d\n" , f [ n - 1 ] + 2 ) ;
}
return 0 ;
}
总结:凡是题目要求我们求非常大的,多组的数,那么正确其中一定会有有规律可循(这也应该是以后一时间所要反应到的),不可能用暴力枚举。

3763

被折叠的 条评论
为什么被折叠?



