【发布时间】:2019-11-29 12:49:29
【问题描述】:
我正在尝试编写一个递归 C 函数来解决河内塔的问题,但有一个额外的限制,禁止将磁盘从 A(源塔)移动到 C(目标塔),反之亦然. 例如,将单个圆盘从 A 移动到 C 或从 C 移动到 A 需要使用辅助塔 (B)。
我从 geeksforgeeks 找到了一个正常的递归河内塔代码并检查了a CS page 其中讨论了同样的问题,但我无法理解数学算法(与 C 函数相比)
void tower(int n, char from, char to, char aux)
{
if (n == 1 && (from=='B' || to=='B'))
{
printf("\n Move 1 from %c to %c", from, to);
return;
}
if(n==1) {
printf("\n Move 1 from %c to %c", from, aux);
printf("\n Move 1 from %c to %c", aux, to);
return;
}
tower(n-1, from, aux, to);
if( from == 'B' || to=='B' ){
printf("\n Move %d from %c to %c", n, from, to);
}
else{
printf("\n Move %d from %c to %c", n, from, aux);
}
tower(n-1, aux, to, from);
}
这是来自 geeksforgeeks 的函数,经过修改以不违反额外限制,但现在它会继续在较小的磁盘上移动较大的磁盘。
我想知道如何解决这个问题以及是否可以针对该限制修改此功能? 提前致谢!
编辑:我一次只能移动一个光盘,因此一些当前可用的算法也无法实现。
【问题讨论】:
-
您应该可以随心所欲地移动,只需检查顶部是否小于您要移动的那块,然后再允许移动。
-
嗨,限制是问题的一部分(我应该以不会从源移动到目标的方式编写它)
-
嗨,我一次不能移动超过一张光盘:(
-
标准的河内塔算法只允许您一次移动一个光盘。我不明白附加限制是什么意思。
标签: c function recursion towers-of-hanoi