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