SlideShare a Scribd company logo
1 of 13
Download to read offline
ハノイの塔 解説 
ギノ株式会社 吉岡 恒夫
問題 
ハノイの塔 
• 問題: https://paiza.jp/learning/hanoi 
• 3つの杭がある。 
• 杭には円盤が置かれている。 
• ある円盤の下には、大きい円盤しか置けない。 
• 一番左の杭に積まれたn段の円盤を一番右に動かす。 
• 最短の方法で移動した場合のt手目の状態を出力 
• 1≤n≤16 
0<t≤2^n-1
解法 
• 一番右の杭について考えると、一番大きい円盤 
から順番に一番右の杭に置く必要がある。 
• まず、一番大きい杭について考える。 
• 一番大きい円盤を動かすためには、大きい円盤 
の上の円盤を真ん中の円盤に動かす必要がある。
解法
解法 
• 関数定義: hanoi(n, 移動元、移動先、あまり) 
n段の円盤を移動元から移動先に移動する関数として定 
義する。 
• hanoi(n-1、移動元、あまり、移動先) 
n-1段を移動元からあまりに移動する。 
• 大きさnの円盤を異動元から移動先に移動する。 
• hanoi(n-1, あまり、移動先、異動元) 
n-1段をあまりから移動先に移動する。
コード
N, 
@T 
= 
gets.split.map(&:to_i) 
@t=0 
@plates 
= 
[ 
N.downto(1).to_a,[],[] 
] 
def 
show 
(0..2).each{|i| 
if 
@plates[i].size 
== 
0 
puts 
"-­‐" 
else 
puts 
@plates[i].join(" 
") 
end 
} 
end 
def 
move_one(n, 
from, 
to) 
plate 
= 
@plates[from].pop 
@plates[to].push(plate) 
@t 
+= 
1 
if 
@t 
== 
@T 
show 
exit 
end 
end 
def 
hanoi(n, 
from, 
to, 
other) 
if 
n 
== 
0 
return 
end 
hanoi(n-­‐1, 
from, 
other, 
to) 
move_one(n, 
from, 
to) 
hanoi(n-­‐1, 
other, 
to, 
from) 
end 
hanoi(N, 
0, 
2, 
1)
プレートを動かす回数 
• hanoi(n): n段の円盤を移動させるのに必要な回数 
• hanoi(n) = hanoi(n-1) * 2 + 1 
• hanoi(n)+1 = (hanoi(n-1)+1)*2 
• hanoi(n)+1 = 2^n 
• hanoi(n) = 2^n - 1 
n=16の場合、65535 => ok! 
• 計算量: O(2^n)
ところで 
• 本物(?)のハノイの塔は64段! 
• もし n = 64なら? 
• 移動回数 
2^64-1= 18446744073709551615 
(1秒に一回移動させるとして1000億年)
解法2 
• nがT以下の場合、シミュレーションしなくても、 
動かしたことにしてしまえばいい!
コード 
def 
hanoi(n, 
from, 
to, 
other) 
if 
n 
== 
0 
return 
end 
if 
@T 
>= 
@t 
+ 
(2**n)-­‐1 
plates 
= 
@plates[from].pop(n) 
@plates[to].push(*plates) 
@t 
+= 
(2**n 
-­‐ 
1) 
show 
if 
@t 
== 
@T 
return 
end 
…
計算量 
• 解法1(総当たり) 
O(2^n) 
• 解法2(最適化後) 
O(n) 
# 各nについてhanoiは一回のみ呼ばれる

More Related Content

What's hot

AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Inc.
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Inc.
 
Scaling Ethereum using Zero-Knowledge Proofs
Scaling Ethereum using Zero-Knowledge ProofsScaling Ethereum using Zero-Knowledge Proofs
Scaling Ethereum using Zero-Knowledge ProofsHyojun Kim
 
Fundamental Analysis for Crypto Assets
Fundamental Analysis for Crypto AssetsFundamental Analysis for Crypto Assets
Fundamental Analysis for Crypto AssetsJesus Rodriguez
 
Different Types of Phishing Attacks
Different Types of Phishing AttacksDifferent Types of Phishing Attacks
Different Types of Phishing AttacksSysCloud
 
深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶしAtCoder Inc.
 
A Zero-Knowledge Proof: Improving Privacy on a Blockchain
A Zero-Knowledge Proof:  Improving Privacy on a BlockchainA Zero-Knowledge Proof:  Improving Privacy on a Blockchain
A Zero-Knowledge Proof: Improving Privacy on a BlockchainAltoros
 
Reverse Engineering Dojo: Enhancing Assembly Reading Skills
Reverse Engineering Dojo: Enhancing Assembly Reading SkillsReverse Engineering Dojo: Enhancing Assembly Reading Skills
Reverse Engineering Dojo: Enhancing Assembly Reading SkillsAsuka Nakajima
 
Proof summit 2017 for slideshare
Proof summit 2017 for slideshareProof summit 2017 for slideshare
Proof summit 2017 for slideshareKeisuke Yahata
 
AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Inc.
 
AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説AtCoder Inc.
 
Crypto Wallets: A Technical Perspective (Nakov at OpenFest 2018)
Crypto Wallets: A Technical Perspective (Nakov at OpenFest 2018)Crypto Wallets: A Technical Perspective (Nakov at OpenFest 2018)
Crypto Wallets: A Technical Perspective (Nakov at OpenFest 2018)Svetlin Nakov
 
Bitcoin, Ethereum, Smart Contract & Blockchain
Bitcoin, Ethereum, Smart Contract & BlockchainBitcoin, Ethereum, Smart Contract & Blockchain
Bitcoin, Ethereum, Smart Contract & BlockchainJitendra Chittoda
 
Svccg nosql 2011_v4
Svccg nosql 2011_v4Svccg nosql 2011_v4
Svccg nosql 2011_v4Sid Anand
 

What's hot (20)

Crypto Currency
Crypto CurrencyCrypto Currency
Crypto Currency
 
暗認本読書会7
暗認本読書会7暗認本読書会7
暗認本読書会7
 
The Heartbleed Bug
The Heartbleed BugThe Heartbleed Bug
The Heartbleed Bug
 
AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説AtCoder Beginner Contest 010 解説
AtCoder Beginner Contest 010 解説
 
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
 
Scaling Ethereum using Zero-Knowledge Proofs
Scaling Ethereum using Zero-Knowledge ProofsScaling Ethereum using Zero-Knowledge Proofs
Scaling Ethereum using Zero-Knowledge Proofs
 
Bit coin presentation
Bit coin presentationBit coin presentation
Bit coin presentation
 
Fundamental Analysis for Crypto Assets
Fundamental Analysis for Crypto AssetsFundamental Analysis for Crypto Assets
Fundamental Analysis for Crypto Assets
 
Different Types of Phishing Attacks
Different Types of Phishing AttacksDifferent Types of Phishing Attacks
Different Types of Phishing Attacks
 
Bitcoin data mining
Bitcoin data miningBitcoin data mining
Bitcoin data mining
 
Ethereum-Cryptocurrency (All about Ethereum)
Ethereum-Cryptocurrency (All about Ethereum) Ethereum-Cryptocurrency (All about Ethereum)
Ethereum-Cryptocurrency (All about Ethereum)
 
深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし深さ優先探索による塗りつぶし
深さ優先探索による塗りつぶし
 
A Zero-Knowledge Proof: Improving Privacy on a Blockchain
A Zero-Knowledge Proof:  Improving Privacy on a BlockchainA Zero-Knowledge Proof:  Improving Privacy on a Blockchain
A Zero-Knowledge Proof: Improving Privacy on a Blockchain
 
Reverse Engineering Dojo: Enhancing Assembly Reading Skills
Reverse Engineering Dojo: Enhancing Assembly Reading SkillsReverse Engineering Dojo: Enhancing Assembly Reading Skills
Reverse Engineering Dojo: Enhancing Assembly Reading Skills
 
Proof summit 2017 for slideshare
Proof summit 2017 for slideshareProof summit 2017 for slideshare
Proof summit 2017 for slideshare
 
AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説AtCoder Regular Contest 023 解説
AtCoder Regular Contest 023 解説
 
AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説AtCoder Regular Contest 025 解説
AtCoder Regular Contest 025 解説
 
Crypto Wallets: A Technical Perspective (Nakov at OpenFest 2018)
Crypto Wallets: A Technical Perspective (Nakov at OpenFest 2018)Crypto Wallets: A Technical Perspective (Nakov at OpenFest 2018)
Crypto Wallets: A Technical Perspective (Nakov at OpenFest 2018)
 
Bitcoin, Ethereum, Smart Contract & Blockchain
Bitcoin, Ethereum, Smart Contract & BlockchainBitcoin, Ethereum, Smart Contract & Blockchain
Bitcoin, Ethereum, Smart Contract & Blockchain
 
Svccg nosql 2011_v4
Svccg nosql 2011_v4Svccg nosql 2011_v4
Svccg nosql 2011_v4
 

More from paiza

paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paiza
 
141214_paizaでpizzaもぐもぐ勉強会
141214_paizaでpizzaもぐもぐ勉強会141214_paizaでpizzaもぐもぐ勉強会
141214_paizaでpizzaもぐもぐ勉強会paiza
 
シリコンバレー 面接体験
シリコンバレー 面接体験シリコンバレー 面接体験
シリコンバレー 面接体験paiza
 
mod7占い【上級・アルゴリズム】解説
mod7占い【上級・アルゴリズム】解説mod7占い【上級・アルゴリズム】解説
mod7占い【上級・アルゴリズム】解説paiza
 
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説paiza
 
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」paiza
 

More from paiza (6)

paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺
 
141214_paizaでpizzaもぐもぐ勉強会
141214_paizaでpizzaもぐもぐ勉強会141214_paizaでpizzaもぐもぐ勉強会
141214_paizaでpizzaもぐもぐ勉強会
 
シリコンバレー 面接体験
シリコンバレー 面接体験シリコンバレー 面接体験
シリコンバレー 面接体験
 
mod7占い【上級・アルゴリズム】解説
mod7占い【上級・アルゴリズム】解説mod7占い【上級・アルゴリズム】解説
mod7占い【上級・アルゴリズム】解説
 
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
paizaオンラインハッカソン(略してPOH![ポー!])Lite「天才火消しエンジニア霧島 もしPMおじさんが『丸投げ』を覚えたら」解説
 
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
【社内勉強会資料】自社サービスエンジニアの為の「UX設計と情報設計」
 

ハノイの塔 解説

  • 2. 問題 ハノイの塔 • 問題: https://paiza.jp/learning/hanoi • 3つの杭がある。 • 杭には円盤が置かれている。 • ある円盤の下には、大きい円盤しか置けない。 • 一番左の杭に積まれたn段の円盤を一番右に動かす。 • 最短の方法で移動した場合のt手目の状態を出力 • 1≤n≤16 0<t≤2^n-1
  • 3.
  • 4. 解法 • 一番右の杭について考えると、一番大きい円盤 から順番に一番右の杭に置く必要がある。 • まず、一番大きい杭について考える。 • 一番大きい円盤を動かすためには、大きい円盤 の上の円盤を真ん中の円盤に動かす必要がある。
  • 6. 解法 • 関数定義: hanoi(n, 移動元、移動先、あまり) n段の円盤を移動元から移動先に移動する関数として定 義する。 • hanoi(n-1、移動元、あまり、移動先) n-1段を移動元からあまりに移動する。 • 大きさnの円盤を異動元から移動先に移動する。 • hanoi(n-1, あまり、移動先、異動元) n-1段をあまりから移動先に移動する。
  • 8. N, @T = gets.split.map(&:to_i) @t=0 @plates = [ N.downto(1).to_a,[],[] ] def show (0..2).each{|i| if @plates[i].size == 0 puts "-­‐" else puts @plates[i].join(" ") end } end def move_one(n, from, to) plate = @plates[from].pop @plates[to].push(plate) @t += 1 if @t == @T show exit end end def hanoi(n, from, to, other) if n == 0 return end hanoi(n-­‐1, from, other, to) move_one(n, from, to) hanoi(n-­‐1, other, to, from) end hanoi(N, 0, 2, 1)
  • 9. プレートを動かす回数 • hanoi(n): n段の円盤を移動させるのに必要な回数 • hanoi(n) = hanoi(n-1) * 2 + 1 • hanoi(n)+1 = (hanoi(n-1)+1)*2 • hanoi(n)+1 = 2^n • hanoi(n) = 2^n - 1 n=16の場合、65535 => ok! • 計算量: O(2^n)
  • 10. ところで • 本物(?)のハノイの塔は64段! • もし n = 64なら? • 移動回数 2^64-1= 18446744073709551615 (1秒に一回移動させるとして1000億年)
  • 12. コード def hanoi(n, from, to, other) if n == 0 return end if @T >= @t + (2**n)-­‐1 plates = @plates[from].pop(n) @plates[to].push(*plates) @t += (2**n -­‐ 1) show if @t == @T return end …
  • 13. 計算量 • 解法1(総当たり) O(2^n) • 解法2(最適化後) O(n) # 各nについてhanoiは一回のみ呼ばれる