梵塔问题编程
求解梵塔问题的关键在于将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)