HDU2064-汉诺塔III:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2064
参考博文:https://blog.csdn.net/narzisen/article/details/79772544
分析:假设有编号1......N的盘子,要将编号为N的盘子移动的最右边的柱子上,那么首先将编号1.....N-1的盘子移动到最右边的柱子上,需要buf[n-1]次,然后将编号为N的盘子移动到中间柱子上,需要1次, 然后将最右边的1.....N-1的盘子移动到最左边柱子上,需要buf[n-1]次,然后将中间编号为N的盘子移动到最右边柱子上,需要1次,最后将最左边柱子上移动到最右边柱子上,需要buf[n-1]次,共需要buf[n]=3*buf[n-1]+2次。代码如下:
#include <stdio.h>
int main ()
{
int n;
long long buf[36];
buf[0] = 0;
buf[1] = 2;
for(int i = 2; i < 36; i++)
{
buf[i] = 3*buf[i-1]+2;
}
while(scanf("%d", &n) != EOF)
{
printf("%lld\n", buf[n]);
}
return 0;
}
HDU:2077-汉诺塔IV
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2077
参考博文:https://blog.csdn.net/qq_41627235/article/details/82959765
代码如下:
#include <stdio.h>
int main ()
{
int n, T;
long long buf[20];
buf[0] = 0;
buf[1] = 2;
for(int i = 2; i < 20; i++)
{
buf[i] = 3*buf[i-1]+2;
}
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
printf("%lld\n", buf[n-1]+2);
}
return 0;
}