三、四柱漢諾塔問題
3、四塔問題:設有A,B,C,D四個柱子(有時稱塔),在A柱上有由小到大堆放的n個盤子,如圖所示。

今將A柱上的盤子移動到D柱上去。可以利用B,C柱作為工作棧用,移動的規則如下:
①每次只能移動一個盤子。
②在移動的過程中,小盤子只能放到大盤子的上面。
①每次只能移動一個盤子。
②在移動的過程中,小盤子只能放到大盤子的上面。
設計并實現一個求解四塔問題的動態規劃算法,并分析時間和空間復雜性。
■ 算法思想:
用如下算法移動盤子(記為FourPegsHanoi):
1)、將A柱上n個盤子劃分為上下兩部分,下方部分共有k(1≤k≤n)個盤子,上方部分共有n - k個盤子。
2)、將A柱上面部分n–k個盤子使用FourPegsHanoi算法經過C、D柱移至B柱。
3)、將A柱剩余的k個盤子使用ThreePegsHanoi算法經過C柱移至D柱。
4)、將B柱上的n–k個盤子使用FourPegsHanoi算法經過A、C柱移至D柱。
ThreePegsHanoi算法如下(設三個柱子分別為A、B、C,A柱上共有k個盤子):
1)、將A柱上方k-1個盤子使用ThreePegsHanoi算法經過B柱移至C柱。
2)、將C柱上最后一個盤子直接移至C盤。
3)、將B柱上k-1個盤子使用ThreePegsHanoi算法經過A柱移至C柱。
■ 算法步驟:
根據動態規劃的四個步驟,求解如下:
1)、最優子結構性質:
四柱漢諾塔問題的最優解是用最少的移動次數將A柱上的盤子全部移到D柱上。當盤子總數為i時,我們不妨設使用FourPegsHanoi的最少移動次數為f(i)。相應的ThreePegsHanoi 算法移動次數為g(k),由于g(k)=2g(k-1)+1=2k -1,當k確定時,g(k)也是不變的。
f(i)為最優解時,其子問題f(i-k)也必為最優解。如果f(i-k)不是最優解,那么存在f’(i-k) < f(i-k)。用f’(i-k)替換f(i-k)將產生一個比f(i)更優的解。這與f(i)為最優解是矛盾的。所以本問題具有最優子結構性質。
2)、遞歸地定義問題的最優解:
根據上述FourPegsHanoi算法得到最少移動次數f(i):

3)、自底向上地計算最優解的值:
(相應的Java源程序在Hanoi.java中。)
f(i)對應算法中的m[i ,
s[i]]。
-----------------------------------------------------------------------------------------
求四柱漢諾塔最小移動次數偽代碼:
數組下標從0開始,數組m,s大小為n+1。數組m存儲計算最小移動次數的中間值。數組s存儲每步最小移動次數所對應的分割值k。
MinMovements ( n ):
m[0,0]
← s[0] ← 0 ?為了方便計算增加了f(0) = m[0,s[0]] = 0
for
i ← 1 to n
do
min ← ∞
for
k ← 1 to i
do
m[i , k] ← 2 * m[i – k , s[i – k]] + 2k – 1
if
m[i , k] < min
then
min ← m[i , k]
s[i] = k
return
m[n , s[n]] & s
4)、根據計算信息構造最優解:
MinMovements求出的數組s中,s[i]是f(i)所對應的最優分割位置。根據數組s來構造移動盤子的最佳序列,偽代碼如下:
-----------------------------------------------------------------------------------------
FourPegsHanoi (i , src, temp1, temp2, dest):
if i = 1
then
move(src , dest)
else FourPegsHanoi(i – s[i] ,
src , temp2 , dest , temp1)
ThreePegsHanoi(s[i] , src ,
temp2 , dest)
FourPegsHanoi(i – s[i] , temp1 , src , temp2 ,
dest)
----------------------------------------------------------------------------------------
ThreePegsHanoi(k , src , temp, dest):
if
k = 1
then
move(src , dest)
else ThreePegsHanoi(k - 1, src , dest ,
temp)
move(src
, dest)
ThreePegsHanoi(k
- 1, temp , src , dest)
-----------------------------------------------------------------------------------------
■
時間空間復雜度分析:
1、時間復雜度
MinMovements算法的時間復雜度為:
T(n) = 1 + 2 + ...
+ n = n(n+1)/2 = O(n2)
2、空間復雜度
MinMovements算法占用的空間為m 和 s數組的大小:
即 (n+1)2
+ (n+1) = O(n2)
通過分析m數組中記錄了一些與結果不相關的數據,所以通過對MinMovements進行改進,可使占用空間減小為O(n)。
MinMovements ( n ):
m[0]
← s[0] ← 0
for
i ← 1 to n
do
m[i] ← ∞
for
k ← 1 to i
do
q ← 2 * m[i – k] + 2k – 1
if
q < m[i]
then
m[i] ← q
s[i] ← k
return
m[n] & s
■
算法測試
當n=10時,最小移動次數49。 移動序列如下:
1 A->D
2 A->B
3 A->C
4 B->C
5 D->C
6 A->B
7 A->D
8 B->D
9 A->B
|
10 D->A
11 D->B
12 A->B
13 C->A
14 C->D
15 C->B
16 D->B
17 A->B
18 A->C
19 A->D
|
20 C->D
21 A->C
22 D->A
23 D->C
24 A->C
25 A->D
26 C->D
27 C->A
28 D->A
29 C->D
|
30 A->C
31 A->D
32 C->D
33 B->C
34 B->D
35 B->A
36 D->A
37 C->A
38 B->D
39 B->C
|
40 D->C
41 B->D
42 C->B
43 C->D
44 B->D
45 A->B
46 A->C
47 A->D
48 C->D
49 B->D
|
當n=15時,最小移動次數129。移動序列如下:
1 A->B
2 A->C
3 A->D
4 C->D
5 B->D
6 A->C
7 A->B
8 C->B
9 A->C
10 B->A
11 B->C
12 A->C
13 D->A
14 D->B
15 D->C
16 B->C
17 A->C
18 A->D
19 A->B
20 D->B
21 A->D
22 B->A
23 B->D
24 A->D
25 A->B
26 D->B
|
27 D->A
28 B->A
29 D->B
30 A->D
31 A->B
32 D->B
33 C->D
34 C->B
35 C->A
36 B->A
37 D->A
38 C->B
39 C->D
40 B->D
41 C->B
42 D->C
43 D->B
44 C->B
45 A->C
46 A->D
47 A->B
48 D->B
49 C->B
50 A->D
51 A->C
52 D->C
|
53 A->D
54 C->A
55 C->D
56 A->D
57 A->C
58 D->C
59 D->A
60 C->A
61 D->C
62 A->D
63 A->C
64 D->C
65 A->D
66 C->A
67 C->D
68 A->D
69 C->A
70 D->C
71 D->A
72 C->A
73 C->D
74 A->D
75 A->C
76 D->C
77 A->D
78 C->A
|
79 C->D
80 A->D
81 B->D
82 B->A
83 B->C
84 A->C
85 D->C
86 B->A
87 B->D
88 A->D
89 B->A
90 D->B
91 D->A
92 B->A
93 C->B
94 C->D
95 C->A
96 D->A
97 B->A
98 B->C
99 B->D
100C->D
101B->C
102D->B
103D->C
104B->C
|
105 B->D
106 C->D
107 C->B
108 D->B
109 C->D
110 B->C
111
B->D
112 C->D
113 A->C
114 A->D
115 A->B
116 D->B
117
C->B
118
A->D
119 A->C
120 D->C
121 A->D
122 C->A
123 C->D
124 A->D
125 B->A
126 B->C
127 B->D
128 C->D
129 A->D
|
文章來源:http://wintys.blog.51cto.com/425414/100703
[附件]:四柱漢諾塔.zip