解題說明
Check if Move is Legal
題目描述:
給定一個 8x8 的棋盤(Othello/黑白棋),棋盤上有 'B'(黑)、'W'(白)和 '.'(空)三種狀態。給定一個位置 (rMove, cMove) 和顏色 color,判斷在該位置放置一個棋子是否為合法操作。
一個操作是合法的,當且僅當至少存在一個「好線段」:從放置的棋子出發,沿八個方向之一,經過一個或多個對方顏色的棋子,最後以己方顏色的棋子結束,且線段長度至少為 3。
解題思路:
- 遍歷八個方向(上、下、左、右及四個對角線方向)。
- 對每個方向,從
(rMove, cMove)出發向外延伸。 - 首先必須遇到至少一個對方顏色的棋子。
- 接著繼續延伸,若最終遇到己方顏色的棋子,則此方向構成一個好線段,操作合法。
- 若遇到空格或越界則此方向不合法,繼續嘗試下一個方向。
- 任一方向合法即返回
true。
C++ 解法
複雜度分析
時間複雜度:O(1) — 棋盤大小固定為 8x8,每個方向最多延伸 7 步,8 個方向共最多 56 步。
空間複雜度:O(1) — 只使用常數額外空間。
虛擬碼
1. Define 8 directions: up, down, left, right, and 4 diagonals
2. For each direction (dr, dc):
a. Start from (rMove + dr, cMove + dc), set length = 1
b. While in bounds and cell == opponent color:
- Move to next cell in direction, increment length
c. If length >= 3 and current cell is in bounds and equals our color:
- Return true (valid good line found)
3. Return false (no valid direction found)其他解法
直接模擬法:邏輯相同,但可以用遞迴代替迭代沿方向延伸。時間複雜度同為 O(1),但遞迴可能有額外的函式呼叫開銷。
預處理法:對每個空格預計算所有方向的合法性,適用於需要多次查詢的場景。時間複雜度 O(64 * 8 * 7) 預處理,之後每次查詢 O(1)。
延伸思考
- 如果棋盤大小不是 8x8 而是 N x N,如何修改算法?時間複雜度如何變化?
- 如何擴展此函式來找出所有合法的落子位置?
- 在 Othello 遊戲中,放置棋子後需要翻轉所有好線段上的對方棋子,如何實現翻轉邏輯?