|
|
<
先去看递回函数的方法:
- /*
- * .::::.
- * .::::::::.
- * :::::::::::
- * ..:::::::::::'
- * '::::::::::::'
- * .::::::::::
- * '::::::::::::::..
- * ..::::::::::::. Utils:递回函数供解汉诺塔游戏
- * ``:::::::::::::::: Author:崔金朋
- * ::::``:::::::::' .:::.
- * ::::' ':::::' .::::::::.
- * .::::' :::: .:::::::'::::.
- * .:::' ::::: .:::::::::' ':::::.
- * .::' :::::.:::::::::' ':::::.
- * .::' ::::::::::::::' ``::::.
- * ...::: ::::::::::::' ``::.
- * ```` ':. ':::::::::' ::::..
- * '.:::::' ':'````..
- */
- package main
- import (
- "fmt"
- "strconv"
- )
- func Hannoi(num int, left, middle, right, from, to string) int {
- if num < 1 {
- return 0
- }
- return Process(num, left, middle, right, from, to)
- }
- func Process(num int, left, middle, right, from, to string) int {
- if num == 1 {
- if from == middle || to == middle {
- step := "Move 1 from " + from + " to " + to
- fmt.Println(step)
- return 1
- } else {
- step1 := "Move 1 from " + from + " to " + middle
- step2 := "Move 1 from " + middle + " to " + to
- fmt.Println(step1)
- fmt.Println(step2)
- return 2
- }
- }
- if from == middle || to == middle {
- var another string
- if from == left || to == left {
- another = left
- } else {
- another = right
- }
- part1 := Process(num-1, left, middle, right, from, another)
- part2 := 1
- step := "Move " + strconv.Itoa(num) + " from " + from + " to " + to
- fmt.Println(step)
- part3 := Process(num-1, left, middle, right, another, to)
- return part1 + part2 + part3
- }
- part1 := Process(num-1, left, middle, right, from, to)
- part2 := 1
- step1 := "Move " + strconv.Itoa(num) + " from " + from + " to " + middle
- fmt.Println(step1)
- part3 := Process(num-1, left, middle, right, to, from)
- part4 := 1
- step2 := "Move " + strconv.Itoa(num) + " from " + middle + " to " + to
- fmt.Println(step2)
- part5 := Process(num-1, left, middle, right, from, to)
- return part1 + part2 + part3 + part4 + part5
- }
复造代码 接下去是栈的方法:
- /*
- * .::::.
- * .::::::::.
- * :::::::::::
- * ..:::::::::::'
- * '::::::::::::'
- * .::::::::::
- * '::::::::::::::..
- * ..::::::::::::. Utils:栈供解汉诺塔游戏
- * ``:::::::::::::::: Author:崔金朋
- * ::::``:::::::::' .:::.
- * ::::' ':::::' .::::::::.
- * .::::' :::: .:::::::'::::.
- * .:::' ::::: .:::::::::' ':::::.
- * .::' :::::.:::::::::' ':::::.
- * .::' ::::::::::::::' ``::::.
- * ...::: ::::::::::::' ``::.
- * ```` ':. ':::::::::' ::::..
- * '.:::::' ':'````..
- */
- package main
- import (
- "fmt"
- "strconv"
- )
- const (
- Number = iota
- LeftToMiddle
- MiddleToLeft
- RightToMiddle
- MiddleToRight
- )
- type HannoiStack struct {
- LeftStack CommonStack
- MiddleStack CommonStack
- RightStack CommonStack
- }
- func (h *HannoiStack) HannoiGame(num int, left, middle, right string) interface{} {
- h.LeftStack.CommonPush(32164)
- h.MiddleStack.CommonPush(32164)
- h.RightStack.CommonPush(32164)
- for i := num; i > 0; i-- {
- h.LeftStack.CommonPush(i)
- }
- retcord := []int{Number}
- step := 0
- for h.RightStack.CommonLen() != num+1 {
- step += h.ToStack(retcord, MiddleToLeft, LeftToMiddle, left, middle, right, left, middle)
- step += h.ToStack(retcord, LeftToMiddle, MiddleToLeft, left, middle, right, middle, left)
- step += h.ToStack(retcord, RightToMiddle, MiddleToRight, left, middle, right, middle, right)
- step += h.ToStack(retcord, MiddleToRight, RightToMiddle, left, middle, right, right, middle)
- }
- return step
- }
- func (h *HannoiStack) ToStack(retcord []int, pre, now int, left, middle, right, from, to string) int {
- fromNum := h.HannoiPeek(from, left, middle, right)
- toNum := h.HannoiPeek(to, left, middle, right)
- if retcord[0] != pre && fromNum < toNum {
- fromElement := h.HannoiPop(from, left, middle, right)
- h.HannoiPush(to, left, middle, right, fromElement)
- toEle := h.HannoiPeek(to, left, middle, right)
- fmt.Println("Move " + strconv.Itoa(toEle) + " from " + from + " to " + to)
- retcord[0] = now
- return 1
- }
- return 0
- }
- func (h *HannoiStack) HannoiPeek(item, left, middle, right string) int {
- if item == left {
- element, _ := h.LeftStack.CommonPeek()
- return element.(int)
- }
- if item == middle {
- element, _ := h.MiddleStack.CommonPeek()
- return element.(int)
- }
- if item == right {
- element, _ := h.RightStack.CommonPeek()
- return element.(int)
- }
- return 0
- }
- func (h *HannoiStack) HannoiPop(item, left, middle, right string) int {
- if item == left {
- element, _ := h.LeftStack.CommonPop()
- return element.(int)
- }
- if item == middle {
- element, _ := h.MiddleStack.CommonPop()
- return element.(int)
- }
- if item == right {
- element, _ := h.RightStack.CommonPop()
- return element.(int)
- }
- return 0
- }
- func (h *HannoiStack) HannoiPush(item, left, middle, right string, pushItem int) bool {
- if item == left {
- h.LeftStack.CommonPush(pushItem)
- return true
- }
- if item == middle {
- h.MiddleStack.CommonPush(pushItem)
- return true
- }
- if item == right {
- h.RightStack.CommonPush(pushItem)
- return true
- }
- return false
- }
复造代码
免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作! |
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
|