限定只能够移动到相邻的柱子的汉诺塔问题

思路:为了移动第n个盘子,必须把前n-1个盘子搬离a柱。所以考虑先把前n-1个盘子移动到c柱(没有相邻条件就可以移动到b柱),这是一个递归的子问题,之后把第n个盘子从a柱到b柱,再把前n-1个盘子从c柱移动回到a柱,再把第n个盘子从b柱放回a柱,然后当第n个盘子不存在(因为它最大),再解决把n-1个盘子从a柱到c柱的子问题
简洁描述如下:

#include<bits/stdc++.h>

using namespace std;

long long cnt;

//柱子定义为x, y, z
void move(int n, char x, char y, char z)
{
    if(n == 1)
    {
        //printf("%c -> %c\n", x, y);//最大盘从x->y
        //printf("%c -> %c\n", y, z);//最大盘从y->z
        cnt += 2;
        return;
    }
    work(n-1, 'a', 'b', 'c');//前n-1个盘子从a柱借助b柱移动到c柱
    //printf("%c -> %c\n", x, y);//最大盘从x->y
    cnt++;
    work(n-1, 'c', 'b', 'a');//前n-1个盘子从c柱借助b柱移动到a柱
    //printf("%c -> %c\n", y, z);//最大盘从y->z
    cnt++;
    work(n-1, 'a', 'b', 'c');//递归处理n-1个盘子的字问题
}

int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        cnt = 0;
        work(n, 'a', 'b', 'c');
        cout << cnt << endl;
    }


    return 0;
}