題目背景
黑白棋(Othello/Reversi)在 8×8 棋盤上進行。雙方輪流落子,夾住對方棋子則翻轉。求從給定局面到目標局面的最少步數,或判斷可行性。
位運算表示棋盤
- 64 格棋盤用兩個 `uint64_t` 分別表示黑棋位、白棋位(1 為有棋子)
- 空位 = `~(black | white)`
- 翻轉操作通過位掩碼與移位高效實現:八個方向分別預計算翻轉掩碼
BFS 搜索最短路徑
- 狀態 = (black_bitmap, white_bitmap, current_player)
- 目標狀態預先給定
- 雙向 BFS 優化:從初始態和目標態同時擴展,相遇時路徑長度 = 雙方深度和
- 訪問集合用 `unordered_map` 存儲 (black<<8 | white<<... 混合鍵) -> 步數
關鍵優化技巧
- **移動生成**:對每個空位檢查八方向是否能翻轉對方棋,位運算批量判斷
- **對稱性剪枝**:棋盤旋轉/鏡像對稱狀態視為同一狀態
- **啟發式排序**:優先嘗試翻轉棋子多的移動(A* 思想)
應用場景
端遊 AI、局面求解器、最短解證明。位運算 + BFS 是棋類遊戲求解的經典組合。