汉诺塔问题思路

发布网友 发布时间:2022-04-22 03:55

我来回答

2个回答

热心网友 时间:2023-07-10 13:46

汉诺塔这个问题,在考虑它递归的时候,别想着我们真实移动的步骤,我当时也总是觉得很乱。你要这样考虑:
1, 2, 3
最初都在1上,最后要移动到3上。所以把除了最后一块都移动到2上,最后一块移动到3上,再把2的都移动到3上。这个过程就结束了。
那怎么把东西都移动到2上呢,你假设,2在3的位置,1还是1, 3在2的位置,这样顺序变成了:
1, 3, 2。
问题就变成了如何把1上的都移动到2上,道理还是一样,就是,把除了最后一块的所有块都移动到3上,把最后一块移动到2上,再把3上面的所有块移动到2上。
这样就能抽象出一个过程:
1.移动多块到2的位置上. //hanoi(n-1,one,three,two);n-1块,从1到2,只看第2个和第4个参数,one,two就是从1到2.
2.移动一块到到3的位置上. //move(one,three);
3.移动在2的位置上的多块到3的位置上. //hanoi(n-1,two,one,three);n-1块,从2到3,只看第2个和第4个参数,two,three就是从2到3.

递归都有一个最终结束的条件,这里就是n=1的时候,也就是只有一个汉诺塔块的时候,只有一个的时候,肯定是从1直接移动到3了。

抽象成函数,就是
void hanoi(int n,char one ,char two,char three){
  if(n==1) move(one,three);  else  {  hanoi(n-1,one,three,two);  move(one,three);  hanoi(n-1,two,one,three);  }
}

void move(char x,char y)
{  printf("%c-->%c\n",x,y);}

热心网友 时间:2023-07-10 13:47

解决汉诺塔问题的思路:

如果只有一个金片,则把该金片从源移动到目标棒,结束。

如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒。

对于汉诺塔问题的求解,可以通过以下三个步骤实现:

将塔A上的n-1个碟子借助塔C先移到塔B上。

把塔A上剩下的一个碟子移到塔C上。

将n-1个碟子从塔B借助塔A移到塔C上。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com