人工智能—问题规约法(Reduction)[二]



梵塔问题编程


求解梵塔问题的关键在于将n盘问题分解为一个1盘问题(本原问题)和两个(n-1)盘问题。然后再将(n-1)盘规约为一个1盘问题和两个(n-2)盘问题。以此类推,最终规约为1盘问题,即本原问题。我们可以用python实现 n 盘转移过程:

这里首先要对我的变量进行说明:
  • n:盘子个数

  • x,y,z:指针表示,这里用赋值为1,2,3

  • state[ ]:n个盘子所在指针的位置。其中列表中位置越靠前表明盘子越大。

  • 若n =4,则初始状态为[1,1,1,1],目标是达到状态[3,3,3,3]

取n= 4,运行文尾代码:

结果如图:

附python代码:

# -*- coding:utf-8 -*-
#返回要改变盘的状态的索引
def getindexz(state,x):
    index = []
    for i in range(len(state)-1,-1,-1):
        if state[i]==x:
           index.append(i)
    return index[0]

def hanoi(n,x,y,z,state): 
    #如果是一盘问题,直接对x位置的盘移动到z  
    if n ==1:
       state[getindexz(state, x)]=z
       #打印盘子的状态
       print x,'--->',z,state
    else:
    #两个n-1盘问题,规约
    #x位置的n-1盘移动到y
       hanoi(n-1, x, z, y,state)
       state[getindexz(state, x)]=z
       print x,'--->',z,state
    #y位置的n-1盘移动到z
       hanoi(n-1, y, x, z,state)      
n = int(raw_input(u'请输入汉诺塔的层数:'))
state =[1 for x in xrange(n)]
hanoi(n,1,2,3,state)

梵塔问题编程


求解梵塔问题的关键在于将n盘问题分解为一个1盘问题(本原问题)和两个(n-1)盘问题。然后再将(n-1)盘规约为一个1盘问题和两个(n-2)盘问题。以此类推,最终规约为1盘问题,即本原问题。我们可以用python实现 n 盘转移过程:

这里首先要对我的变量进行说明:
  • n:盘子个数

  • x,y,z:指针表示,这里用赋值为1,2,3

  • state[ ]:n个盘子所在指针的位置。其中列表中位置越靠前表明盘子越大。

  • 若n =4,则初始状态为[1,1,1,1],目标是达到状态[3,3,3,3]

取n= 4,运行文尾代码:

结果如图:

附python代码:

# -*- coding:utf-8 -*-
#返回要改变盘的状态的索引
def getindexz(state,x):
    index = []
    for i in range(len(state)-1,-1,-1):
        if state[i]==x:
           index.append(i)
    return index[0]

def hanoi(n,x,y,z,state): 
    #如果是一盘问题,直接对x位置的盘移动到z  
    if n ==1:
       state[getindexz(state, x)]=z
       #打印盘子的状态
       print x,'--->',z,state
    else:
    #两个n-1盘问题,规约
    #x位置的n-1盘移动到y
       hanoi(n-1, x, z, y,state)
       state[getindexz(state, x)]=z
       print x,'--->',z,state
    #y位置的n-1盘移动到z
       hanoi(n-1, y, x, z,state)      
n = int(raw_input(u'请输入汉诺塔的层数:'))
state =[1 for x in xrange(n)]
hanoi(n,1,2,3,state)
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值