题目描述
给出一个汉诺塔游戏中的某一个阶段的状态,你能算出它从最初始状态到该状态用了最少的步数吗
输入说明
第一行输入整数 n (1 \le n \le 60)n(1≤n≤60),表示圆盘的数量,圆盘的标号分别是 1,2,…,n1,2,…,n 。
接下来输入三行,第 ii 行输入 kk,表示第 ii 根柱子的圆盘数量,后面接着输入 kk 个数,表示柱子上从上到下圆盘的编号。 保证输入是一个合法的汉诺塔游戏状态。
输出说明
输出一行,表示到达给的状态的最小步数。
样例输入
3
1 3
2 1 2
0
样例输出
3
代码
默认题目要求为从 1柱 通过 2柱 移动到 3柱
#include<iostream>
#include<vector>
using namespace std;
vector<int> d, pos;
int n, ans = 0;
void init(int n)
{
d.resize(n + 1);
pos.resize(n + 1);
d[0] = 0;
for(int i = 1; i <= n; ++i)
d[i] = 2 * d[i-1] + 1;
}
void f(int num, int from, int other, int to)
{
if(num < 1) return;
if(pos[num] == from) {
f(num - 1, from, to, other);
} else {
ans += d[num-1] + 1;
f(num - 1, other, from, to);
}
}
int main()
{
cin >> n;
init(n);
for(int i = 1; i <= 3; ++i) {
int k;
cin >> k;
for(int j = 0; j < k; ++j) {
int tmp;
cin >> tmp;
pos[tmp] = i;
}
}
f(n, 1, 2, 3);
cout << ans << endl;
return 0;
}