日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

百练OJ:4147:汉诺塔问题(Hanoi)——python实现汉诺塔

發(fā)布時(shí)間:2025/3/19 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 百练OJ:4147:汉诺塔问题(Hanoi)——python实现汉诺塔 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、漢諾塔問(wèn)題

??有三根桿子A,B,C。A桿上有N個(gè)(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規(guī)則將所有圓盤移至C桿: 每次只能移動(dòng)一個(gè)圓盤; 大盤不能疊在小盤上面。 提示:可將圓盤臨時(shí)置于B桿,也可將從A桿移出的圓盤重新移回A桿,但都必須遵循上述兩條規(guī)則。

??問(wèn):如何移?最少要移動(dòng)多少次?

漢諾塔示意圖如下:


二、故事由來(lái)?

????法國(guó)數(shù)學(xué)家愛(ài)德華·盧卡斯曾編寫過(guò)一個(gè)印度的古老傳說(shuō):在世界中心貝拿勒斯(在印度北部)的圣廟里,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創(chuàng)造世界的時(shí)候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個(gè)僧侶在按照下面的法則移動(dòng)這些金片:一次只移動(dòng)一片,不管在哪根針上,小片必須在大片上面。僧侶們預(yù)言,當(dāng)所有的金片都從梵天穿好的那根針上移到另外一根針上時(shí),世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸于盡。

????不管這個(gè)傳說(shuō)的可信度有多大,如果考慮一下把64片金片,由一根針上移到另一根針上,并且始終保持上小下大的順序。這需要多少次移動(dòng)呢?這里需要遞歸的方法。假設(shè)有n片,移動(dòng)次數(shù)是f(n).顯然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不難證明f(n)=2^n-1。n=64時(shí), 假如每秒鐘一次,共需多長(zhǎng)時(shí)間呢?一個(gè)平年365天有31536000 秒,閏年366天有31622400秒,平均每年31556952秒,計(jì)算一下: 18446744073709551615秒 這表明移完這些金片需要5845.54億年以上,而地球存在至今不過(guò)45億年,太陽(yáng)系的預(yù)期壽命據(jù)說(shuō)也就是數(shù)百億年。真的過(guò)了5845.54億年,不說(shuō)太陽(yáng)系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經(jīng)灰飛煙滅。

三、解法

??解法的基本思想是遞歸。假設(shè)有A、B、C三個(gè)塔,A塔有N塊盤,目標(biāo)是把這些盤全部移到C塔。那么先把A塔頂部的N-1塊盤移動(dòng)到B塔,再把A塔剩下的大盤移到C,最后把B塔的N-1塊盤移到C。 每次移動(dòng)多于一塊盤時(shí),則再次使用上述算法來(lái)移動(dòng)。

輸入
輸入為一個(gè)整數(shù)后面跟三個(gè)單字符字符串。
整數(shù)為盤子的數(shù)目,后三個(gè)字符表示三個(gè)桿子的編號(hào)。
輸出
輸出每一步移動(dòng)盤子的記錄。一次移動(dòng)一行。
每次移動(dòng)的記錄為例如3:a->b 的形式,即把編號(hào)為3的盤子從a桿移至b桿。
我們約定圓盤從小到大編號(hào)為1, 2, ...n。即最上面那個(gè)最小的圓盤編號(hào)為1,最下面最大的圓盤編號(hào)為n。
樣例輸入
3 a b c
樣例輸出
1:a->c 2:a->b 1:c->b 3:a->c 1:b->a 2:b->c 1:a->c
解法:def move( num, sour, dest):print(num, end=':')print(sour, end='->')print(dest)def hanoi( num, sour, tem, dest):if num == 1:move(num, sour, dest)else:hanoi(num-1, sour, dest, tem)move(num, sour, dest)hanoi(num-1, tem, sour, dest)n=input() hanoi(int (n.split()[0]),n.split()[1],n.split()[2],n.split()[3])

總結(jié)

以上是生活随笔為你收集整理的百练OJ:4147:汉诺塔问题(Hanoi)——python实现汉诺塔的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。