问题定义
我正在尝试编写一个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
答案 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);
}