Algorithm 河内塔的二元解
我在读书 下面是第213页的摘录,涉及数字二进制表示中尾随零的数量 对于河内塔问题,对应关系的含义 使用n位数字是一个简单的任务算法。我们可以搬家 通过以下两个步骤将一个销钉堆放到右侧,直至完成:Algorithm 河内塔的二元解,algorithm,towers-of-hanoi,Algorithm,Towers Of Hanoi,我在读书 下面是第213页的摘录,涉及数字二进制表示中尾随零的数量 对于河内塔问题,对应关系的含义 使用n位数字是一个简单的任务算法。我们可以搬家 通过以下两个步骤将一个销钉堆放到右侧,直至完成: 如果n为奇数,则将小磁盘向右移动(如果n为偶数,则向左移动) 进行唯一合法的移动,不涉及小磁盘 也就是说,移动小dsik后,其他两个销钉包含两个 磁盘,一个比另一个小。唯一不涉及 小圆盘将把小圆盘移到大圆盘上。每一个 其他移动涉及更小的磁盘,原因与每个 另一个数字是奇数,规则上的每一个标记都是奇数 最
Disk1
Disk2
Disk3
------- ------------ ------------
Peg A Peg B Peg C
这个特殊问题的解决方案是:将
Disk1
移动到Peg B
,将Disk2
移动到Peg C
,将Disk1
移动到Peg C
,将Disk3
移动到Peg B
,将Disk1
移动到Peg A
,将Disk2
移动到Peg B
,将移动到,将Disk1
移动到Peg B
。完成。这个特殊问题的解决方案是:将Disk1
移动到Peg B
,将Disk2
移动到Peg C
,将Disk1
移动到Peg C
,将Disk3
移动到Peg B
,将Disk1
移动到Peg A
,将Disk2
移动到Peg B
,,将Disk1
移动到Peg B
。完成。这里要注意的第一件事是,在这个算法中,第一个peg被认为是最后一个peg的右边,最后一个peg被认为是第一个peg的左边
反复应用列出的两个步骤将导致n
磁盘塔向右移动一个销钉
在n=3
的情况下,n
是奇数,因此两个移动是:
将Disk1
向右移动一个销钉
进行唯一不涉及Disk1
的合法移动
通过重复这些动作给出以下解决方案:
Disk1:PegA->PegB
(向右移动Disk1
一个peg)
Disk2:PegA->PegC
(仅合法移动不涉及Disk1
)
Disk1:PegB->PegC
(向右移动Disk1
一个peg)
Disk3:PegA->PegB
(仅合法移动不涉及Disk1
)
Disk1:PegC->PegA
(向右移动Disk1
一个peg)
Disk2:PegC->PegB
(仅合法移动不涉及Disk1
)
Disk1:PegA->PegB
(向右移动Disk1
一个peg)
当Sedgewick写“与n位数字的对应关系”时,他指的是在解决方案的步骤k
中移动的磁盘是与k
二进制表示中最低有效1
位对应的磁盘。i、 e.对于n=3
:
step | bits | disk
------------------
1 | 001 | 1
2 | 010 | 2
3 | 011 | 1
4 | 100 | 3
5 | 101 | 1
6 | 110 | 2
7 | 111 | 1
这里首先要注意的是,在这个算法中,第一个peg被认为是最后一个peg的右边,最后一个peg被认为是第一个peg的左边
反复应用列出的两个步骤将导致n
磁盘塔向右移动一个销钉
在n=3
的情况下,n
是奇数,因此两个移动是:
将Disk1
向右移动一个销钉
进行唯一不涉及Disk1
的合法移动
通过重复这些动作给出以下解决方案:
Disk1:PegA->PegB
(向右移动Disk1
一个peg)
Disk2:PegA->PegC
(仅合法移动不涉及Disk1
)
Disk1:PegB->PegC
(向右移动Disk1
一个peg)
Disk3:PegA->PegB
(仅合法移动不涉及Disk1
)
Disk1:PegC->PegA
(向右移动Disk1
一个peg)
Disk2:PegC->PegB
(仅合法移动不涉及Disk1
)
Disk1:PegA->PegB
(向右移动Disk1
一个peg)
当Sedgewick写“与n位数字的对应关系”时,他指的是在解决方案的步骤k
中移动的磁盘是与k
二进制表示中最低有效1
位对应的磁盘。i、 e.对于n=3
:
step | bits | disk
------------------
1 | 001 | 1
2 | 010 | 2
3 | 011 | 1
4 | 100 | 3
5 | 101 | 1
6 | 110 | 2
7 | 111 | 1
如果这对任何人都有帮助,我在这里用python编写了一个完整的解决方案:
#/usr/bin/env python
#
#解决这个问题的方法很简单,但对于N=奇数或偶数的环,方法略有不同。
#
#在每次移动中,您可以执行a)或b):
#
#a)将“1”值向右移动到销钉上,如果需要,将其环绕到第一个销钉上
#
#b)采取其他唯一合法行动
#
#然后对(2^numrings)-1重复a)或b)。
#
#因此,对于N=3,您将执行上述步骤7次。
#
#我前面提到的一个问题是,对于N==奇数(3,5,…),您需要重复这一点
#整个算法再重复一次,因为上面只会将环向右移动一个销钉。
#
导入系统
#
#打印塔以便我们检查进度
#
def打印塔(销钉、螺母):
npegs=长度(pegs)
对于范围内的y(0,nrings):
h=nrings-y
对于范围内的x(0,npegs):
如果len(pegs[x])>=h:
sys.stdout.write(str(pegs[x][len(pegs[x])-h])+“”)
其他:
sys.stdout.wr