两个汉诺塔,一个是普通版的,另一个是加上必须经过中间柱子的。
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
int ans = 0, n;
long long ans2 = 0;
void hmove(char a, char b, char c, int n){
if(n == 0){
return ;
}
hmove(a, c, b, n - 1); //前n - 1块从a移动到b上
printf("%c -> %c\n", a, c); //我自己移动一块从a -> c
ans++; //我移动了几次?
hmove(b, a, c, n - 1); //最后把 n - 1块从b移动到c上
}
//只能先移动到相邻的柱子上
void hmove2(char a, char b, char c, int n){
if(n == 0){
return ;
}
hmove2(a, b, c, n - 1); //把前n - 1块通过b移动到c上
ans2++; //把最后一块移动到b上
printf("%c -> %c\n", a, b);
hmove2(c, b , a, n - 1); //把n - 1 块通过b移动到a上
ans2++; //把最后一块移动到c上
printf("%c -> %c\n", b, c);
hmove2(a, b, c, n - 1); //把剩下的n - 1块通过b移动到c上
}
int main(){
scanf("%d", &n);
printf("普通汉诺塔\n");
hmove('a', 'b', 'c', n);
printf("%d\n", ans);
printf("本题目汉诺塔\n");
hmove2('a', 'b', 'c', n);
printf("%lld\n", ans2);
}
来源:CSDN
作者:FightingDependent
链接:https://blog.csdn.net/fuzekun/article/details/104478251