河内塔禁止从源头移动到目的地 (C)
Tower of Hanoi with forbidden move from source to destination (C)
我正在尝试编写一个递归 C 函数来解决河内塔,但有一个额外的限制,即禁止将圆盘从 A(源塔)移动到 C(目标塔),并且反之亦然。
例如,将单个圆盘从 A 移动到 C 或从 C 移动到 A,将需要使用辅助塔 (B)。
我从 geeksforgeeks 找到了一个正常的递归 Hanoi 塔代码并检查了 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 的功能,已修改为不违反额外限制,但现在它会继续将较大的磁盘移动到较小的磁盘之上。
我想知道如何解决这个问题,是否可以针对该限制修改此功能?
提前致谢!
edit: 我一次只能移动一个圆盘,所以一些当前可用的算法也无法实现。
谢谢大家!
我找到了一个 C++ 代码,所以我将 post 放在这里并进行一些修改,以防以后有人遇到同样的问题:
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);
}
}
我正在尝试编写一个递归 C 函数来解决河内塔,但有一个额外的限制,即禁止将圆盘从 A(源塔)移动到 C(目标塔),并且反之亦然。 例如,将单个圆盘从 A 移动到 C 或从 C 移动到 A,将需要使用辅助塔 (B)。
我从 geeksforgeeks 找到了一个正常的递归 Hanoi 塔代码并检查了 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 的功能,已修改为不违反额外限制,但现在它会继续将较大的磁盘移动到较小的磁盘之上。
我想知道如何解决这个问题,是否可以针对该限制修改此功能? 提前致谢!
edit: 我一次只能移动一个圆盘,所以一些当前可用的算法也无法实现。
谢谢大家! 我找到了一个 C++ 代码,所以我将 post 放在这里并进行一些修改,以防以后有人遇到同样的问题:
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);
}
}