程序员代码面试指南 python实现(用栈来求解汉诺塔问题)
程序员代码面试指南 python实现(第一章 栈和队列)
用栈来求解汉诺塔问题
题目描述
分析
方法一:递归方法
源码
def process(num,left,mid,right,from_,to_):
if num == 1:
if from_ == mid or to_ == mid:
print("Move 1 from "+from_+" to "+to_)
else:
print("Move 1 from "+from_+" to "+to_)
print("Move 1 from "+mid+" to "+to_)
return 2
if from_ == mid or to_ == mid:
if from_ == left or to_ == left:
another = right
else:
another = left
part1 = process(num-1,left,mid,right,from_,another)
part2 = 1
print("Move "+str(num)+" from "+from_+" to "+ to_)
part3 = process(num-1,left,mid,right,another,to_)
return part1+part2+part3
else:
part1 = process(num-1,left,mid,right,from_,to_)
part2 = 1
print("Move "+str(num)+ " from "+from_+ " to "+mid)
part3 = process(num-1,left,mid,right,to_,from_)
part4 = 1
print("Move "+str(num)+ " from "+mid + " to "+ to_)
part5 = process(num-1,left,mid,right,from_,to_)
return part1+part2+part3+part4+part5
def hanoiProblem(num,left,mid,right):
if num < 1:
return 0
return process(num,left,mid,right,left,right)
方法二:非递归方法----用栈来模拟
from enum import Enum
import sys
MAX_INT = sys.maxsize
class Action(Enum):
No=0
LToM=1
MToR=2
RToM=3
MToL=4
class Stack(object):
def __init__(self):
self.item = []
def isEmpty(self):
return self.item ==[]
def push(self,newElem):
self.item.append(newElem)
def pop(self):
if self.isEmpty():
raise Exception("Your static is Empty!")
else:
return self.item.pop()
def peek(self):
if self.isEmpty():
raise Exception("Your static is Empty!")
else:
return self.item[len(self.item)-1]
def size(self):
return len(self.item)
def fStackTotStack(record,preNoAct,nowAct,fStack,tStack,from_,to_):
if record[0] != preNoAct and fStack.peek() < tStack.peek():
tStack.push(fStack.pop())
print("Move"+str(tStack.peek())+" from "+ from_+" to " +to_)
record[0] = nowAct
return 1
else:
return 0
def hanoiProblem2(num,left,mid,right):
ls = Stack()
ms = Stack()
rs = Stack()
ls.push(MAX_INT)
ms.push(MAX_INT)
rs.push(MAX_INT)
i = num
while (i > 0):
ls.push(i)
i=i-1
record = []
record.append(Action.No)
step = 0
while(rs.size() != num + 1):
step += fStackTotStack(record,Action.MToL,Action.LToM,ls,ms,left,mid)
step += fStackTotStack(record,Action.LToM,Action.MToL,ms,ls,mid,left)
step += fStackTotStack(record,Action.RToM,Action.MToR,ms,rs,mid,right)
step += fStackTotStack(record,Action.MToR,Action.RToM,rs,ms,right,mid)
return step