最近在重溫資料結構和演算法分析。剛好手頭有個九連環,就想著用遞迴寫寫個九連環的解法。九連環解法的基本原則:
這三個簡單規則就構成了遞迴解法的基礎。
%matplotlib qt
import matplotlib.pyplot as plt
from matplotlib.patches import circle
# 模擬九連環,1表示在杆上,0表示不在
ring =[0
,1,1
,1,1
,1,1
,1,1
,1]up =
1down =
0steps =
0 fig = plt.figure(figsize=(12
,3))
defvisual
(steps,index,action)
:if action == up:
title =
'setp-%s: %s ring up'
%(steps,index)
else
: title =
'setp-%s: %s ring down'
%(steps,index)
plt.cla(
) ax = fig.add_subplot(
111)
plt.axis(
'off'
) plt.plot([1
,35],
[7,7
],'k-'
,linewidth=2)
for i in
range(1
,10):
y = ring[i]*3
+4color =
'red'
if ring[i]
else
'blue'
cir = circle(xy =
(3.5
*i, y)
, radius=
1, alpha=
0.5,facecolor= color)
ax.add_patch(cir)
plt.title(title)
plt.axis([0
,40,0
,10])
plt.pause(
0.5)
defring_updown
(index,action)
:# 如果是第乙個環,那麼可以自由拆卸
global steps
if index ==1:
steps +=
1 ring[index]
= action
visual(steps,index,action)
return
none
# 如果第 n-1 個環不在杆上,需要先裝上
if ring[index-1]
==0:# n-1 not on the ring
ring_updown(index-
1,up)
# n-2 個環需要全部不在杆上,如果有環在杆上,需要先卸下來
for i in
range
(index-2,
0,-1
):if ring[i]==1
:# n-2,n-3,... no the ring
ring_updown(i,down)
steps +=
1 ring[index]
= action
visual(steps,index,action)
return
none
for i in
range(9
,0,-
1): ring_updown(i,down)
上面的**,除去圖示的部分,只有10行有效**。
一共執行了341步驟。
九連環 好玩的九連環
九連環是中國最傑出的益智遊戲。九連環作為我國民間玩具,以金屬絲製成9個圓環,將圓環套裝在橫板或各式框架上,並貫以環柄。遊戲時,按照一定的程式反覆操作,可使9個圓環分別解開,或合而為一。九連環 現已成為一種國際性的益智遊戲,國內外都有學者在研究,拆解九連環的過程中也蘊含著一些數學原理。九連環的迷人之處...
九連環 兒子的玩具 九連環
兒子是7月22號結束了中考,23號參加自主招生考試,24號收到錄取 25號領取通知書,26號正式上課成為一名高中生,結束初中生活還沒來得及歇歇高中就這樣開始了。高中生活非常緊張,早上六點起床趕去學校上自習,晚上十點下課,回到家基本上是十點十五分之間,週日下午放假六小時,晚上接著到校自習,每天的學習時...
九連環 九連環中的數學原理
九連環作為我國民間玩具,以金屬絲製成9個圓環,將圓環套裝在橫板或各式框架上,並貫以環柄。遊戲時,按照一定的程式反覆操作,可使9個圓環分別解開,或合而為一。九連環 現已成為一種國際性的益智遊戲,國內外都有學者在研究,拆解九連環的過程中也蘊含著一些數學原理。2.如圖二所示,如果某乙個環在上面的環杆上,而...