"""
File: hanota.py
Created Time: 2023-07-16
Author: Krahets (krahets@163.com)
"""


def move(src: list[int], tar: list[int]):
    """移动一个圆盘"""
    # 从 src 顶部拿出一个圆盘
    pan = src.pop()
    # 将圆盘放入 tar 顶部
    tar.append(pan)


def dfs(i: int, src: list[int], buf: list[int], tar: list[int]):
    """求解汉诺塔：问题 f(i)"""
    # 若 src 只剩下一个圆盘，则直接将其移到 tar
    if i == 1:
        move(src, tar)
        return
    # 子问题 f(i-1) ：将 src 顶部 i-1 个圆盘借助 tar 移到 buf
    dfs(i - 1, src, tar, buf)
    # 子问题 f(1) ：将 src 剩余一个圆盘移到 tar
    move(src, tar)
    # 子问题 f(i-1) ：将 buf 顶部 i-1 个圆盘借助 src 移到 tar
    dfs(i - 1, buf, src, tar)


def hanota(A: list[int], B: list[int], C: list[int]):
    """求解汉诺塔"""
    n = len(A)
    # 将 A 顶部 n 个圆盘借助 B 移到 C
    dfs(n, A, B, C)


"""Driver Code"""
if __name__ == "__main__":
    # 列表尾部是柱子顶部
    A = [5, 4, 3, 2, 1]
    B = []
    C = []
    print("初始状态下：")
    print(f"A = {A}")
    print(f"B = {B}")
    print(f"C = {C}")

    hanota(A, B, C)

    print("圆盘移动完成后：")
    print(f"A = {A}")
    print(f"B = {B}")
    print(f"C = {C}")
