题4:Hanoi双塔问题
( h a n o i . p a s / c / c p p ) (hanoi.pas/c/cpp) (hanoi.pas/c/cpp)
# 【题目描述】
给定 A , B , C A,B,C A,B,C三根足够长的细柱,在 A A A柱上放有 2 n 2n 2n个中间有空的圆盘,共有 n n n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为 n = 3 n=3 n=3的情形)。现要将这些圆盘移到 C C C柱上,在移动过程中可放在 B B B柱上暂存。要求:
(1) 每次只能移动一个圆盘;
(2) A 、 B 、 C A、B、C A、B、C三根细柱上的圆盘都要保持上小下大的顺序;
任务:设
A
n
An
An为
2
n
2n
2n个圆盘完成上述任务所需的最少移动次数,对于输入的
n
n
n,输出
A
n
An
An。
# 【输入文件】
输入文件 h a n o i . i n hanoi.in hanoi.in 为一个正整数 n n n,表示在A柱上放有 2 n 2n 2n个圆盘。
# 【输出文件】
输出文件 h a n o i . o u t hanoi.out hanoi.out 仅一行,包含一个正整数,为完成上述任务所需的最少移动次数 A n An An。
# 【输入样例1】 hanoi.in
1
# 【输出样例1】 hanoi.out
2
# 【输入样例2】 hanoi.in
2
# 【输出样例2】 hanoi.out
6
# 【限制】
对于 50 % 50\% 50%的数据, 1 ≤ n ≤ 25 1 \le n \le 25 1≤n≤25
对于 100 % 100\% 100% 数据, 1 ≤ n ≤ 200 1 \le n \le 200 1≤n≤200
# 【提示】
设法建立 A n An An与 A n − 1 An−1 An−1的递推关系式。
【代码如下】:
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, s[1001] = {0}, q = 0;
s[0] = 2;
cin >> a;
for (int p = 2; p <= a; p++) {
for (int g = 0; g <= 1000; g++) {
if (s[g] == 0) continue;
s[g] *= 2;
}
s[0] += 2;
for (int l = 0; l <= 1000; l++)
if (s[l] > 9) {
s[l + 1] += s[l] / 10;
s[l] %= 10;
}
}
for (int g = 1000; g >= 0; g--) {
if (s[g] == 0 && q == 0) continue;
q++;
cout << s[g];
}
return 0;
}