如何解决这个河内塔的变化

时间:2015-01-24 17:44:49

标签: algorithm recursion

我一直在努力弄清楚如何解决我遇到的河内塔楼的变化,其中有一个限制是每一步都应该涉及中间挂钩。以下是河内常规塔楼的代码,但没有约束条件:

   public void Transfer(int numberOfDisks, Stack<int>[] pegs, int @from, int to, int use)
   {
       if (numberOfDisks > 0)
       {
           Transfer(numberOfDisks - 1, pegs, @from, use, to);

           pegs[use].Push(pegs[@from].Peek());
           pegs[@from].Pop();

           Console.WriteLine("Move disk: " + numberOfDisks + " from P" + @from + " to P" + to);

           Transfer(numberOfDisks - 1, pegs, use, to, @from);
       }
   }

2 个答案:

答案 0 :(得分:1)

1. move smallest for 2 moves in 1 direction.
2. move other token (only possible token) by 1 move
3. goto point 1

答案 1 :(得分:0)

这应该很容易解决,在适当的图表上使用广度优先搜索。请注意,我记得因为我实际上不会在内存中构建图形。现在,从第一个顶点表示的初始状态开始。然后,对于每个允许的移动,创建边缘。如果尚未访问结果状态,请将其添加到顶点的FIFO中以进行访问...基本上它是一个没有任何特殊内容的BFS,我希望您明白这一点,否则请找一个详细解释BFS的教程。

请注意,我不相信使用这个附加规则游戏仍然可以解决,但即使这样也应该很容易用这种方法来证明。