#55261: cpp_answer


yp11451202@yphs.tp.edu.tw (705-38黃鈺潤)


#include <iostream>

using namespace std;

/**
 * n: 當前箱子總數
 * i: 目標移動步數
 * src: 起始柱子
 * aux: 輔助柱子
 * dest: 目標柱子
 */
void solve(int n, long long i, int src, int aux, int dest) {
    // 計算移動第 n 個箱子所需的步數位置 (2^(n-1))
    long long mid = 1LL << (n - 1);

    if (i == mid) {
        // 如果剛好是中間這一步,就是移動第 n 個箱子
        cout << "move " << n << " from " << src << " to " << dest << endl;
    } else if (i < mid) {
        // 如果步數小於中間值,箱子在前半段:從 src 移往 aux
        solve(n - 1, i, src, dest, aux);
    } else {
        // 如果步數大於中間值,箱子在後半段:從 aux 移往 dest
        // 步數要減去前半段已完成的次數
        solve(n - 1, i - mid, aux, src, dest);
    }
}

int main() {
    int N;
    long long i;
    
    // 讀入 N 與第 i 次移動
    while (cin >> N >> i) {
        solve(N, i, 1, 2, 3);
    }
    
    return 0;
}