Medium草稿★★★★★O(8 * 8) 時間 · O(1) 空間
GraphMatrixSimulation
Patterns🕸️ 圖遍歷・連通分量🎮 模擬
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

1958Check if Move Is LegalGraphsMediumGraphs

在 8x8 的棋盤上,'B' 代表黑色、'W' 代表白色、'.' 代表空格。在位置 (rMove, cMove) 放置顏色 color 的棋子,判斷是否形成合法的「好線段」(兩端同色,中間至少一個異色,長度至少 3)。

Example:

Input: board = [[”.”,”.”,”.”,”.”,”.”,”.”,”.”,”.”],[”.”,”.”,”.”,”.”,”.”,”.”,”.”,”.”],[”.”,”.”,”.”,”.”,”.”,”.”,”.”,”.”],[”.”,”.”,”.”,”.”,”.”,”.”,”.”,”.”],[”.”,”.”,”.”,”.”,”.”,”.”,”.”,”.”],[”.”,”.”,”.”,”.”,”.”,”.”,”.”,”.”],[”.”,”.”,”.”,”.”,”.”,”.”,”.”,”.”],[”.”,”.”,”.”,”.”,”.”,”.”,”.”,”.”]], rMove = 4, cMove = 3, color = “B” Output: true

Intuition

TIP

從放置位置出發,沿八個方向延伸,檢查是否存在同色棋子夾住異色棋子的線段。

Approaches

⭐ 1. Eight-Direction Scan — O(8 * 8) = O(1) / O(1)
  • Idea: 對每個方向,沿路檢查是否有連續異色棋子後接同色棋子
  • Time: O(8 * 8) = O(1)(棋盤固定大小)
  • Space: O(1)
class Solution {
    fun checkMove(board: Array<CharArray>, rMove: Int, cMove: Int, color: Char): Boolean {
        val dirs = arrayOf(
            intArrayOf(0, 1), intArrayOf(0, -1), intArrayOf(1, 0), intArrayOf(-1, 0),
            intArrayOf(1, 1), intArrayOf(1, -1), intArrayOf(-1, 1), intArrayOf(-1, -1)
        )

        for ((dr, dc) in dirs) {
            var r = rMove + dr
            var c = cMove + dc
            var length = 1

            while (r in 0..7 && c in 0..7 && board[r][c] != '.' && board[r][c] != color) {
                r += dr
                c += dc
                length++
            }

            if (length >= 2 && r in 0..7 && c in 0..7 && board[r][c] == color) {
                return true
            }
        }
        return false
    }
}
2. Same Logic, Alternative Form — O(1) / O(1)
  • Idea: 封裝方向檢查為獨立函式
  • Time: O(1)
  • Space: O(1)
class Solution {
    fun checkMove(board: Array<CharArray>, rMove: Int, cMove: Int, color: Char): Boolean {
        fun check(dr: Int, dc: Int): Boolean {
            var r = rMove + dr
            var c = cMove + dc
            var count = 0
            while (r in 0..7 && c in 0..7 && board[r][c] != '.' && board[r][c] != color) {
                r += dr
                c += dc
                count++
            }
            return count >= 1 && r in 0..7 && c in 0..7 && board[r][c] == color
        }

        for (dr in -1..1) {
            for (dc in -1..1) {
                if (dr == 0 && dc == 0) continue
                if (check(dr, dc)) return true
            }
        }
        return false
    }
}

🔑 Takeaways