汉诺塔问题
递归实现汉诺塔
//汉诺塔递归版
#include<stdio.h>
//解决n个盘从a移到c,其中b为辅助的递归函数
void Hanoi(int n,int a,int b,int c){ // n:要移动的盘子的数量
if(1==n){ //可以直接移动
printf("%c -> %c\n",a,c);
}else{
Hanoi(n-1,a,c,b); //第一步 1~n-1号盘,从a柱移到b柱上
Hanoi( 1 ,a,b,c); //第二步 直接将n号盘,从a柱移到c柱上
Hanoi(n-1,b,a,c); //第三步 1~n-1号盘,从b柱移到c柱的n号盘上
}
} //其实也可以第二步替换为 printf("%c -> %c\n",a,c); 只是为了描述原理,统一更方便
int main() {
int N;
scanf("%d",&N);
Hanoi(N,'a','b','c');
return 0;
}
非递归实现
利用栈模拟递归过程而已
#include <iostream>
#include <stack>
using namespace std;
struct station // 存放状态
{
int n;
char a, b, c;
};
stack<station> S; // 栈来记录递归的状态
void push(int n, char a, char b, char c)
{
// 入栈
station t;
t.n = n, t.a = a, t.b = b, t.c = c;
S.push(t); // 入栈
}
void Hanoi()
{
// 取出来
station t = S.top();
int n = t.n;
char a = t.a, b = t.b, c = t.c;
S.pop();
if (n == 1)
{
printf("%c -> %c\n", a, c);
/* code */
}
else
{
push(n - 1, b, a, c);
push(1, a, b, c);
push(n - 1, a, c, b);
}
}
int main()
{
int n;
cin >> n;
push(n, 'a', 'b', 'c');
while (!S.empty()) // 状态栈非空
{
Hanoi();
}
return 0;
}