递归汉诺塔
已知有三个柱子用 a、 b、 c 表示。
在 a 柱子中从小到大放 n 个盘子,现要求把所有的盘子从 a 柱子全部移到 c 柱子。移动规则是:使用 b 作为过渡,每次只移动一块盘子,且每个柱子上不能出现大盘压小盘,找出移动次数最小的方案。
【输入描述】
输入一行。输入柱子的数量,和每个柱子的符号,用空格隔开。
【输出描述】
输出若干行,分别表示移动盘子的过程。
【输入样例】
3 a b c
【输出样例】
a->1->c
a->2->b
c->1->b
a->3->c
b->1->a
b->2->c
a->1->c
【参考程序】
// 小牛编程
#include <bits/stdc++.h>
using namespace std;
/**
*把第n号盘子从a移动到c(注意参数的顺序)
*b是中转柱(注意谁是中转盘)
*/
void hanoi(int n, char a, char b, char c) {
if (n == 0)
return;
//移动n-1整体盘子,从a到b,c是中转盘
hanoi(n - 1, a, c, b);
//移动编号 n 的盘子
printf("%c->%d->%c\n", a, n, c);
//移动n-1整体盘子,从b到c,a是中转盘
hanoi(n - 1, b, a, c);
}
int main() {
int n;
char a, b, c;
cin >> n >> a >> b >> c;
//如果是移动到b, 互换b、c参数位置;(一本通1205)
hanoi(n, a, b, c);
return 0;
}