汉诺塔程序python_如何使用python实现的汉诺塔的小程序

python是面向对象的语言,但是做面向过程的操作,也是得心应手。

代码如下:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from requests.exceptions import RequestException

#定义栈,作为塔的数据结构

class Stack(object):

def __init__(self, name):

self.items = []

self.name = name;

def isEmpty(self):

return self.items == []

def push(self, item):

self.items.append(item)

def pop(self):

return self.items.pop()

def peek(self):

return self.items[len(self.items) - 1]

def size(self):

return len(self.items)

#定义移动的块

class Block(object):

def __init__(self, size, location):

self.size = size

self.location = location

def setlocation(location):

self.location = location

#移动汉诺塔

def moveblock(s1,s2):

if(s1.size() > 0):

if (s2.size() ==0) or ((s2.size() > 0) and (s2.peek().id > s1.peek().id)):

b = s1.pop()

s2.push(b)

b.location = s2.name

print (b.id, s1.name, "--->", s2.name)

else:

print("can not move")

#显示汉诺塔

def display(s1,s2,s3):

disp(s1)

disp(s2)

disp(s3)

def disp(s):

st=Stack(s.name)

print(s.name)

while(s.size()>0):

b = s.pop()

print(b.id)

st.push(b)

while(st.size()>0):

s.push(st.pop())

#移动汉诺塔

def hanoi(n, a, b, c):

if (n == 1):

moveblock(a, c)

else:

hanoi(n - 1, a, c, b)

moveblock(a, c)

hanoi(n - 1, b, a, c)

#主程序,传入汉诺塔的层高

def main(n):

#定义三个塔

sLeft = Stack("left")

sMiddles = Stack("middle")

sRights = Stack("right")

# 定义n层Block

for i in range(n):

block = Block(n-i,"left")

sLeft.push(block)

display(sLeft, sMiddles, sRights)

hanoi(n, sLeft, sMiddles, sRights)

display(sLeft,sMiddles, sRights)

if __name__ == '__main__':

main(5)

程序运行结果:

left

1

2

3

4

5

middle

right

1 left ---> right

2 left ---> middle

1 right ---> middle

3 left ---> right

1 middle ---> left

2 middle ---> right

1 left ---> right

4 left ---> middle

1 right ---> middle

2 right ---> left

1 middle ---> left

3 right ---> middle

1 left ---> right

2 left ---> middle

1 right ---> middle

5 left ---> right

1 middle ---> left

2 middle ---> right

1 left ---> right

3 middle ---> left

1 right ---> middle

2 right ---> left

1 middle ---> left

4 middle ---> right

1 left ---> right

2 left ---> middle

1 right ---> middle

3 left ---> right

1 middle ---> left

2 middle ---> right

1 left ---> right

left

middle

right

1

2

3

4

5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值