题4:Hanoi双塔问题
(hanoi.pas/c/cpp)(hanoi.pas/c/cpp)(hanoi.pas/c/cpp)
# 【题目描述】
给定A,B,CA,B,CA,B,C三根足够长的细柱,在AAA柱上放有2n2n2n个中间有空的圆盘,共有nnn个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3n=3n=3的情形)。现要将这些圆盘移到CCC柱上,在移动过程中可放在BBB柱上暂存。要求:
(1) 每次只能移动一个圆盘;
(2) A、B、CA、B、CA、B、C三根细柱上的圆盘都要保持上小下大的顺序;
任务:设AnAnAn为2n2n2n个圆盘完成上述任务所需的最少移动次数,对于输入的nnn,输出AnAnAn。
# 【输入文件】
输入文件 hanoi.inhanoi.inhanoi.in 为一个正整数nnn,表示在A柱上放有2n2n2n个圆盘。
# 【输出文件】
输出文件 hanoi.outhanoi.outhanoi.out 仅一行,包含一个正整数,为完成上述任务所需的最少移动次数AnAnAn。
# 【输入样例1】 hanoi.in
1
# 【输出样例1】 hanoi.out
2
# 【输入样例2】 hanoi.in
2
# 【输出样例2】 hanoi.out
6
# 【限制】
对于50%50\%50%的数据, 1≤n≤251 \le n \le 251≤n≤25
对于100%100\%100% 数据, 1≤n≤2001 \le n \le 2001≤n≤200
# 【提示】
设法建立AnAnAn与An−1An−1An−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;
}