陳胤辰中原商設
首頁
簡介
講師介紹開課資訊
課程
運算思維與程式設計自然科學與人工智慧程式語言導論
互動
物品交換三門問題下注模擬器數字推盤河內塔
編程
線上編程P5.js
應用
人體系統玄學系統建築系統

語言

繁體中文简体中文English

陳胤辰

中原大學商業設計系
資宸科技

快速連結

  • 講師介紹
  • 開課資訊
  • 互動遊戲
  • 程式教學
  • 文章

聯絡 & 社群

© 2026 陳胤辰。保留所有權利。

Built with Next.js & Tailwind CSS

🎮 遊戲🏆 排行📖 原理

數字推盤怎麼最短路徑解?

BFS 與 A* 演算法入門

問題定義

8-Puzzle(3×3 數字推盤)有一個空格,目標是把打亂的數字用最少步數排列成有序狀態(1~8 從左到右、從上到下)。整個問題空間有 181,440 種合法排列,需要有效率的搜尋演算法。

廣度優先搜尋(BFS)

一層一層從起點向外擴展,保證找到最短步數解。缺點是每個狀態都要存下來,記憶體消耗隨步數指數增長。3×3 可以撐住,4×4 的 15-Puzzle 就爆炸了。

A* 演算法

BFS + 啟發式函數,優先探索「看起來更近目標」的狀態。評估函數 f(n) = g(n) + h(n),其中 g 是已走步數,h 是到終點的估計(曼哈頓距離)。比 BFS 快幾十倍。

BFS 核心程式碼(Python)

from collections import deque

def bfs(start, goal):
    queue = deque([(start, [])])   # (目前狀態, 移動路徑)
    visited = {start}

    while queue:
        state, path = queue.popleft()
        if state == goal:
            return path            # 找到最短路徑!

        for next_state, move in get_neighbors(state):
            if next_state not in visited:
                visited.add(next_state)
                queue.append((next_state, path + [move]))

    return None   # 無解(此排列不可達)

A* 的啟發式:曼哈頓距離

def manhattan_distance(state, goal):
    total = 0
    for i, val in enumerate(state):
        if val == 0:
            continue               # 空格不計算
        goal_idx = goal.index(val)
        row_diff = abs(i // 3 - goal_idx // 3)
        col_diff = abs(i % 3 - goal_idx % 3)
        total += row_diff + col_diff
    return total

# 例:數字 5 在位置 (2,1),目標是 (1,1)
# 曼哈頓距離 = |2-1| + |1-1| = 1

計算機會自動判斷你的初始盤面是否有解(有一半的排列是無解的!),並提供最優步數提示。