c - 禁止从源头移动到目的地的河内塔 (C)
问题描述
我正在尝试编写一个递归 C 函数来解决河内的塔,但有一个额外的限制,禁止将磁盘从 A(源塔)移动到 C(目标塔),反之亦然。例如,将单个圆盘从 A 移动到 C 或 C 到 A 将需要使用辅助塔 (B)。
我从 geeksforgeeks 找到了一个正常的递归河内塔代码,并检查了一个讨论相同问题的 CS 页面 ,但我无法理解数学算法(与 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++ 代码,所以我会在这里发布它并进行一些修改,以防以后有人有同样的问题:
void hanoi(int n,string src, string itm, string des)
{
if (n>=1){
hanoi((n-1),src,itm,des);
cout<<"Move Plate "<<n<<" from "<<src <<" to "<<itm<<"\n";
hanoi((n-1),des,itm,src);
cout<<"Move Plate "<<n<<"from "<<itm <<" to "<<des<<"\n";
hanoi((n-1),src,itm,des);
}
}
推荐阅读
- java - Apache Tomcat 在 localhost:8080 显示一个已经制作的 WAR 文件而不是主页
- javascript - 如何使用 javascript 关闭浏览器开发控制台?
- java - Android 应用程序将在收到有关电池状态的系统广播时打印吐司
- python - 将字典中的值转换为单个列表
- java - 如何使用动作监听器处理框架?
- python - 如何将字符串解析为对象数组?
- docker - haproxy docker-compose 主机名无法解析
- python - 从字符串和列表中删除python输出中的引号
- java - onBindViewHolder 上的代码在获取数据之前运行:java.lang.IndexOutOfBoundsException:索引:5,大小:5
- python - 基于当前和前一行数据的自动计算列,将用于即将到来的行 SQL、Django