n ≤ 63 個盤,從 A 移到 B,最優解步數 2^n - 1。設 `calc(k, goal)` 為將前 `k` 小盤全部移至 `goal` 柱所需步數。
觀察第 `k` 個盤(最大的未就位盤):
#include
using namespace std;
using ll = long long;
string s; // s[0] 最小盤,s[n-1] 最大盤
int n;
ll calc(int k, char goal) { // k: 1-indexed 前 k 個盤
for (int i = k; i >= 1; --i) {
if (s[i-1] != goal) {
char other = 'A' ^ 'B' ^ 'C' ^ s[i-1] ^ goal; // 三柱異或得第三根
return calc(i-1, other) + (1LL << (i-1));
}
}
return 0;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
while (cin >> s) {
if (s == "X") break;
n = s.size();
cout << calc(n, 'B') << "\n";
}
return 0;
}
O(n)。