入門-ハノイのタワーを移動
8418 ワード
n個のディスクのハノイタワーを移動するためのディスク移動順序のアルゴリズムを出力する。
ハノイのタワールール
•始点柱から終点柱にn個の大きさの異なる円盤を移動する必要があります.
一度に1つのディスクしか移動できません.
•円盤を移動する場合は、1つの柱の上部から円盤を抽出し、それを別の柱の上部にのみ移動することができます(柱の中央から円盤を取り出すことはできません.また、抽出した円盤を別の柱の中央に挿入することはできません).
•ディスクを移動するときは、大きなディスクを小さなディスクに持ち上げることはできません.
ハノイのタワー
1番柱の円盤を3番柱に移すと終わりです.(1 → 3)
1番柱の一番上の円盤を2番柱に移します.(1 → 2)
1番柱に残っている大きな円盤を3番柱に移します.(1 → 3)
2番柱に残っている円盤を3番柱に移す.(2 → 3)
ハノイの塔規によると、一度に2つの円盤を運ぶことはできないが、私たちはすでに2つの円盤の時、ハノイの塔がどのように解けたのかを知っていて、その方法に従えばいい.
1番柱の3つの円盤のうち、上の2つの円盤を空の2番柱(補助柱)に移動します.(1→3、1→2、3→2)実際に円盤が3回移動しています
1号機に残っている大きな円盤を3番柱に移す.(1 → 3)
今回は2番柱の2つの円盤を3番柱に移します.(2→1,2→3,1→3)実際に円盤が3回移動した
n回汎用>>再帰呼び出しを使用可能
n個の円盤が
ハノイのtopアルゴリズム
ディスクが1つしかない場合は、[終了条件](End Condition)になります.n個のディスク問題を解くにはn−1個のディスク問題を解く必要があり,これが「より小さな値で自分を呼び出す」プロセスである.従って、この問題は典型的な再帰呼び出しアルゴリズムに相当する.
# 하노이의 탑
# 입력: 옮기려는 원반의 개수 n
# 옮길 원반이 현재 있는 출발점 기둥 from_pos
# 원반을 옮길 도착점 기둥 to_pos
# 옮기는 과정에서 사용할 보조 기둥 aux_pos
# 출력: 원반을 옮기는 순서
def hanoi(n, from_pos, to_pos, aux_pos):
if n == 1: # 원반 한 개를 옮기는 문제면 그냥 옮기면 됨
print(from_pos, ”->“, to_pos)
return
# 원반 n -1개를 aux_pos로 이동(to_pos를 보조 기둥으로)
hanoi(n -1, from_pos, aux_pos, to_pos)
# 가장 큰 원반을 목적지로 이동
print(from_pos, ”->“, to_pos)
# aux_pos에 있는 원반 n -1개를 목적지로 이동(from_pos를 보조 기둥으로)
hanoi(n - 1, aux_pos, to_pos, from_pos)
print(“n = 1”)
hanoi(1, 1, 3, 2) # 원반 한 개를 1번 기둥에서 3번 기둥으로 이동(2번을 보조 기둥으로)
print(“n = 2”)
hanoi(2, 1, 3, 2) # 원반 두 개를 1번 기둥에서 3번 기둥으로 이동(2번을 보조 기둥으로)
print(“n = 3”)
hanoi(3, 1, 3, 2) # 원반 세 개를 1번 기둥에서 3번 기둥으로 이동(2번을 보조 기둥으로)
n = 1 # hanoi(1, 1, 3, 2)
1 -> 3 # print(1,”->“,3)
n = 2 # hanoi(2, 1, 3, 2)
1 -> 2 # hanoi(1, 1, 2, 3)
1 -> 3 # print(1,”->“,3)
2 -> 3 # hanoi(1, 2, 3, 1)
n = 3
1 -> 3
1 -> 2
3 -> 2
1 -> 3
2 -> 1
2 -> 3
1 -> 3
アルゴリズム解析
入力サイズ、すなわち、タワーの層数が高いほど、円盤がより多く移動します.
n階のハノイタワーを運ぶには、原盤を(2 nリットル-1)回運ぶ.同様に,nが大きくなると−1はあまり意味がなく,O(2 n)で表すことができる.これは2にnを乗じた値で,nが大きくなるにつれて幾何級数が増加する.
移動回数:2 x H(n-1)+1
H(n) = 2H(n-1) + 1
H(1) = 1
H(2) = 2 H(1) + 1 = 2 + 1 = 3
H(3)=2 H(2)+1=2 x 3+1=4(2の2勝)+2+1=7
H(4)=2 H(3)+1=2 x 7+1=8(2の3勝)+4(2の2勝)+2+1=1=15…
Reference
この問題について(入門-ハノイのタワーを移動), 我々は、より多くの情報をここで見つけました https://velog.io/@eunaahn/알고리즘-입문-하노이의-탑-옮기기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol