汉诺塔-递归 VS 非递归

问题描述:
  有一个梵塔,塔内有三个座A、B、C,A 座上有诺干个盘子,盘子大小不等,大的在下,小的在上(如图)。把这些个盘子从 A 座移到 C 座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中,3 个座上的盘子始终保持大盘在下,小盘在上。


汉诺塔-递归

#include <iostream>
#include <cstdlib>

using namespace std;

void move(char x, int n, char y) {
    cout << "把编号为" << n << "的盘从" << x << "移到" << y << endl;
}

void hanoi(int N, char A, char C, char B) {
    if(N == 1) {
        move(A, 1, B);
    } else {
        hanoi(N-1, A, B, C);
        move(A, N, B);
        hanoi(N-1, C, A ,B);
    }
}

int main() {
    cout << "           ------汉诺塔递归实现------\n" << endl;
    cout << "说明:利用C塔将盘子从A塔移到B塔\n" << endl;
    cout << "请输入A塔盘子的个数:";
    int n = 1;
    cin >> n;
    cout << "移动步骤:" << endl;
    hanoi(n, 'A', 'C', 'B');
    system("PAUSE");
    return 0;
}

汉诺塔-非递归

#include <iostream>
#include <cstdlib>

using namespace std;

static void hanoi(int n) {
    int fromPole, toPole, Disk;
    int *BitStr = new int[n],*Hold = new int[n];
    char Place[] = {'A', 'B', 'C'};
    int i, j, temp;
    for(i=0; i < n; i++) {
        BitStr[i] = 0;
        Hold[i] = 1;
    }
    temp = 3 - (n % 2);
    int TotalMoves = (1 << n) - 1;
    for (i=1; i <= TotalMoves; i++) {
        for (j=0 ; BitStr[j] != 0; j++) {
            BitStr[j] = 0;
        }
        BitStr[j] = 1;
        Disk = j+1;
        if (Disk == 1) {
            fromPole = Hold[0];
            toPole = 6 - fromPole - temp;
            temp = fromPole;
        } else {
            fromPole = Hold[Disk-1];
            toPole = 6 - Hold[0] - Hold[Disk-1];
        }
        cout << "把编号为" << Disk << "的盘子从" << Place[fromPole-1]
             << "移到" << Place[toPole-1] << endl;
        Hold[Disk-1] = toPole;
    }
}

int main() {
    cout << "           ------汉诺塔非递归实现------: \n" << endl
         << "说明:利用塔C将盘子从塔A移到塔B\n" << endl;
    cout << "请输入A塔的盘子个数: ";
    int n;
    cin >> n;
    hanoi(n);
    system("PAUSE");
    return 0;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值