汉诺塔问题

参考

递归实现汉诺塔

//汉诺塔递归版
#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;
}
posted @ 2023-02-10 20:31  诗子黎  阅读(22)  评论(0编辑  收藏  举报