扩建的河内塔

时间:2017-12-15 15:19:21

标签: c++ recursion towers-of-hanoi

问题定义
我正在尝试编写一个c ++程序来解决int main(void) { unsigned long RAM; int unit; // index of below symbols array char symbol[5] = {'B', 'K', 'M', 'G', 'T'}; unit = ByteReDim(12884901888, 12, &RAM); printf("%lu%c\n", RAM, symbol[unit]); // output is 12884901888B unit = ByteReDim(12884901888, 9, &RAM); printf("%lu%c\n", RAM, symbol[unit]); // output is 12582912K unit = ByteReDim(12884901888, 6, &RAM); printf("%lu%c\n", RAM, symbol[unit]); // output is 12288M unit = ByteReDim(12884901888, 3, &RAM); printf("%lu%c\n", RAM, symbol[unit]); // output is 12G } 问题。
扩展的河内塔类似于标准的河内问题。区别在于,奇数环在 A (1,3,5,...)中,偶数环在 B (2,4,6,... )。问题是,如何以递归的方式将所有响铃转移到 C

我写了到目前为止我所做的一切。 任何帮助让我实施我的方法或任何想法来实施该计划将不胜感激! 谢谢!

规则
1.一次只能移动一个磁盘 2.没有磁盘可以放在较小的磁盘上 3.输出应包含必要的移动,而不是最小必要的移动
4.磁盘总数可以是偶数或奇数 5.实施应该是递归的。

方法1
我们假设已经解决了当前在A和B中的n-1个环的问题。这意味着它们都被移到C和C有2n-2个有序环。之后我们必须处理A& amp;中剩余的环。 B.这意味着我们必须把较小的戒指放在较大的戒指上(从B到A)。之后,我们必须合并C(2n-2)中的环和A(2)中的环。最后,我们必须使用标准的河内解决方案来实现我们的目标,并将所有环转移到C。

实施1

Extended Hanoi Tower

Releated Resources
Link

2 个答案:

答案 0 :(得分:2)

我们可以在B上将A从1加2。

我们可以通过标准河内将A中的1,2放在A上3。所有其他磁盘都较大,可以忽略。

我们可以通过标准河内将B中的1,2,3从B超过4。所有其他磁盘都较大,可以忽略。 ........

当我们将所有磁盘安排在一个极上时,它们或者在A上(如果磁盘总数是奇数)或者是B(偶数)。

标准河内将它们全部移至C.

虽然这可能被认为是一种迭代方法,但是你要求递归方法。

所以,递归:假设总共有n个磁盘。通过递归应用程序将n-1个磁盘移动到C.标准河内将n-1个磁盘从C移动到A(n是奇数)或B(n是偶数)。通过标准河内将生成的n磁盘移动到C.

这与您提议的非常类似,除了n代表磁盘(环)的总数。它也不是纯粹的递归。

答案 1 :(得分:0)

非常感谢@ Will-Ness !!
这是可能的解决方案之一。
希望这可以帮助 ! :)

#include <iostream>
using namespace std;

// function declarations
void customHanoi(long int, char = 'A', char = 'B', char = 'C');
void standardHanoi(long int, char = 'A', char = 'B', char = 'C');

int main()
{
    // initialize the variable
    long int n;
    // getting the number of rings
    cin >> n;
    // move odd & even rings to the first shaft, recursively
    // after that move all rings from first shaft to the destination shaft
    customHanoi(n);
    // our program finished successfully
    return 0;
}

// A: the shaft that holds odd rings
// B: the shaft that holds even rigns
// C: the final destination shaft
void customHanoi(long int n, char A, char B, char C)
{
    // initialize the variable
    static long int level = 1;

    // we can't handle zero/negative disk
    if (n < 1)
        return;

    // the base condition of recursion
    if (level == n)
    {
        // now, we moved all rings to the first shaft
        // so, we have to move them to the destination shaft
        standardHanoi(n);
        // finish the execution of recursion
        return;
    }

    // reordering the disks
    // based on even or odd number of disks & current level
    if (n % 2 == 1)
    {
        if (level % 2 == 1)
            standardHanoi(level, A, C, B);
        else
            standardHanoi(level, B, C, A);
    }
    else
    {
        if (level % 2 == 1)
            standardHanoi(level, B, C, A);
        else
            standardHanoi(level, A, C, B);
    }

    // go to the next level, it helps us control the flow
    level++;
    // the recursive calls
    customHanoi(n);
}

// a recursive function to find the solution for standard hanoi
void standardHanoi(long int n, char from, char helper, char to)
{
    // the base condition
    if (n == 1)
    {
        cout << from << " " << to << endl;
        return;
    }
    // the recursive calls
    standardHanoi(n - 1, from, to, helper);
    cout << from << " " << to << endl;
    standardHanoi(n - 1, helper, from, to);
}