第十二届北京师范大学程序设计竞赛 H. 汉诺塔

H. 汉诺塔

汉诺塔是源自印度神话的玩具。

故事是这样的:上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上,并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭,也有人相信婆罗门至今还在一刻不停地搬动着圆盘。

我们把这个问题重新描述一下:

有三根杆子A,B,C。有N个穿孔圆盘,圆盘的大小两两不同。一开始N个圆盘随机地放在3个杆子上,每个圆盘放在每个杆子上的概率都相同,同一个杆子上圆盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:

    1.每次只能移动一个圆盘;

    2.大盘不能叠在小盘上面。

提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。

问:将所有圆盘移至C杆所需最少步数的期望。

Input

数据的第一行为数据组数T(T≤30)。

接下来的T行每行一个数N(1≤N≤30)表示圆盘数量。

Output

对于每组数据,输出一个两位小数表示所需步数的期望。

Sample Input

2
1
2

Sample Output

0.67
2.00
 
 


思路:汉诺塔公式: An = 2^n - 1 ,因为是随机分配的,所以期望值为 (2/3)(2^n-1) 侥幸猜中..

代码:

#include <stdio.h>
#include <math.h>
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int n;
		scanf("%d", &n);
		double ans = 2 / 3.0*(pow(2.0, n) - 1);
		printf("%.2lf\n", ans);
	}
	return 0;
}

你可能感兴趣的:(C++,ACM)