限定只能够移动到相邻的柱子的汉诺塔问题
思路:为了移动第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;
}


京公网安备 11010502036488号