Go-求解汉诺塔游戏【递归函数&栈】两种方式

游戏 游戏 1246 人阅读 | 0 人回复

<
先去看递回函数的方法:
  1. /*
  2. *                    .::::.
  3. *                  .::::::::.
  4. *                 :::::::::::
  5. *             ..:::::::::::&#39;
  6. *           &#39;::::::::::::&#39;
  7. *             .::::::::::
  8. *        &#39;::::::::::::::..
  9. *             ..::::::::::::.                Utils:递回函数供解汉诺塔游戏
  10. *           ``::::::::::::::::                Author:崔金朋
  11. *            ::::``:::::::::&#39;        .:::.
  12. *           ::::&#39;   &#39;:::::&#39;       .::::::::.
  13. *         .::::&#39;      ::::     .:::::::&#39;::::.
  14. *        .:::&#39;       :::::  .:::::::::&#39; &#39;:::::.
  15. *       .::&#39;        :::::.:::::::::&#39;      &#39;:::::.
  16. *      .::&#39;         ::::::::::::::&#39;         ``::::.
  17. *  ...:::           ::::::::::::&#39;              ``::.
  18. * ```` &#39;:.          &#39;:::::::::&#39;                  ::::..
  19. *                             &#39;.:::::&#39;                                  &#39;:&#39;````..
  20. */
  21. package main
  22. import (
  23.         "fmt"
  24.         "strconv"
  25. )
  26. func Hannoi(num int, left, middle, right, from, to string) int {
  27.         if num < 1 {
  28.                 return 0
  29.         }
  30.         return Process(num, left, middle, right, from, to)
  31. }
  32. func Process(num int, left, middle, right, from, to string) int {
  33.         if num == 1 {
  34.                 if from == middle || to == middle {
  35.                         step := "Move 1 from " + from + " to " + to
  36.                         fmt.Println(step)
  37.                         return 1
  38.                 } else {
  39.                         step1 := "Move 1 from " + from + " to " + middle
  40.                         step2 := "Move 1 from " + middle + " to " + to
  41.                         fmt.Println(step1)
  42.                         fmt.Println(step2)
  43.                         return 2
  44.                 }
  45.         }
  46.         if from == middle || to == middle {
  47.                 var another string
  48.                 if from == left || to == left {
  49.                         another = left
  50.                 } else {
  51.                         another = right
  52.                 }
  53.                 part1 := Process(num-1, left, middle, right, from, another)
  54.                 part2 := 1
  55.                 step := "Move " + strconv.Itoa(num) + " from " + from + " to " + to
  56.                 fmt.Println(step)
  57.                 part3 := Process(num-1, left, middle, right, another, to)
  58.                 return part1 + part2 + part3
  59.         }
  60.         part1 := Process(num-1, left, middle, right, from, to)
  61.         part2 := 1
  62.         step1 := "Move " + strconv.Itoa(num) + " from " + from + " to " + middle
  63.         fmt.Println(step1)
  64.         part3 := Process(num-1, left, middle, right, to, from)
  65.         part4 := 1
  66.         step2 := "Move " + strconv.Itoa(num) + " from " + middle + " to " + to
  67.         fmt.Println(step2)
  68.         part5 := Process(num-1, left, middle, right, from, to)
  69.         return part1 + part2 + part3 + part4 + part5
  70. }
复造代码
接下去是栈的方法:
  1. /*
  2. *                    .::::.
  3. *                  .::::::::.
  4. *                 :::::::::::
  5. *             ..:::::::::::&#39;
  6. *           &#39;::::::::::::&#39;
  7. *             .::::::::::
  8. *        &#39;::::::::::::::..
  9. *             ..::::::::::::.                Utils:栈供解汉诺塔游戏
  10. *           ``::::::::::::::::                Author:崔金朋
  11. *            ::::``:::::::::&#39;        .:::.
  12. *           ::::&#39;   &#39;:::::&#39;       .::::::::.
  13. *         .::::&#39;      ::::     .:::::::&#39;::::.
  14. *        .:::&#39;       :::::  .:::::::::&#39; &#39;:::::.
  15. *       .::&#39;        :::::.:::::::::&#39;      &#39;:::::.
  16. *      .::&#39;         ::::::::::::::&#39;         ``::::.
  17. *  ...:::           ::::::::::::&#39;              ``::.
  18. * ```` &#39;:.          &#39;:::::::::&#39;                  ::::..
  19. *                             &#39;.:::::&#39;                                  &#39;:&#39;````..
  20. */
  21. package main
  22. import (
  23.         "fmt"
  24.         "strconv"
  25. )
  26. const (
  27.         Number = iota
  28.         LeftToMiddle
  29.         MiddleToLeft
  30.         RightToMiddle
  31.         MiddleToRight
  32. )
  33. type HannoiStack struct {
  34.         LeftStack   CommonStack
  35.         MiddleStack CommonStack
  36.         RightStack  CommonStack
  37. }
  38. func (h *HannoiStack) HannoiGame(num int, left, middle, right string) interface{} {
  39.         h.LeftStack.CommonPush(32164)
  40.         h.MiddleStack.CommonPush(32164)
  41.         h.RightStack.CommonPush(32164)
  42.         for i := num; i > 0; i-- {
  43.                 h.LeftStack.CommonPush(i)
  44.         }
  45.         retcord := []int{Number}
  46.         step := 0
  47.         for h.RightStack.CommonLen() != num+1 {
  48.                 step += h.ToStack(retcord, MiddleToLeft, LeftToMiddle, left, middle, right, left, middle)
  49.                 step += h.ToStack(retcord, LeftToMiddle, MiddleToLeft, left, middle, right, middle, left)
  50.                 step += h.ToStack(retcord, RightToMiddle, MiddleToRight, left, middle, right, middle, right)
  51.                 step += h.ToStack(retcord, MiddleToRight, RightToMiddle, left, middle, right, right, middle)
  52.         }
  53.         return step
  54. }
  55. func (h *HannoiStack) ToStack(retcord []int, pre, now int, left, middle, right, from, to string) int {
  56.         fromNum := h.HannoiPeek(from, left, middle, right)
  57.         toNum := h.HannoiPeek(to, left, middle, right)
  58.         if retcord[0] != pre && fromNum < toNum {
  59.                 fromElement := h.HannoiPop(from, left, middle, right)
  60.                 h.HannoiPush(to, left, middle, right, fromElement)
  61.                 toEle := h.HannoiPeek(to, left, middle, right)
  62.                 fmt.Println("Move " + strconv.Itoa(toEle) + " from " + from + " to " + to)
  63.                 retcord[0] = now
  64.                 return 1
  65.         }
  66.         return 0
  67. }
  68. func (h *HannoiStack) HannoiPeek(item, left, middle, right string) int {
  69.         if item == left {
  70.                 element, _ := h.LeftStack.CommonPeek()
  71.                 return element.(int)
  72.         }
  73.         if item == middle {
  74.                 element, _ := h.MiddleStack.CommonPeek()
  75.                 return element.(int)
  76.         }
  77.         if item == right {
  78.                 element, _ := h.RightStack.CommonPeek()
  79.                 return element.(int)
  80.         }
  81.         return 0
  82. }
  83. func (h *HannoiStack) HannoiPop(item, left, middle, right string) int {
  84.         if item == left {
  85.                 element, _ := h.LeftStack.CommonPop()
  86.                 return element.(int)
  87.         }
  88.         if item == middle {
  89.                 element, _ := h.MiddleStack.CommonPop()
  90.                 return element.(int)
  91.         }
  92.         if item == right {
  93.                 element, _ := h.RightStack.CommonPop()
  94.                 return element.(int)
  95.         }
  96.         return 0
  97. }
  98. func (h *HannoiStack) HannoiPush(item, left, middle, right string, pushItem int) bool {
  99.         if item == left {
  100.                 h.LeftStack.CommonPush(pushItem)
  101.                 return true
  102.         }
  103.         if item == middle {
  104.                 h.MiddleStack.CommonPush(pushItem)
  105.                 return true
  106.         }
  107.         if item == right {
  108.                 h.RightStack.CommonPush(pushItem)
  109.                 return true
  110.         }
  111.         return false
  112. }
复造代码


免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则