Java實現 LeetCode 794 有效的井字遊戲 (暴力分析)

794. 有效的井字遊戲

用字符串數組作爲井字遊戲的遊戲板 board。當且僅當在井字遊戲過程中,玩家有可能將字符放置成遊戲板所顯示的狀態時,才返回 true。

該遊戲板是一個 3 x 3 數組,由字符 " ",“X” 和 “O” 組成。字符 " " 代表一個空位。

以下是井字遊戲的規則:

玩家輪流將字符放入空位(" ")中。
第一個玩家總是放字符 “X”,且第二個玩家總是放字符 “O”。
“X” 和 “O” 只允許放置在空位中,不允許對已放有字符的位置進行填充。
當有 3 個相同(且非空)的字符填充任何行、列或對角線時,遊戲結束。
當所有位置非空時,也算爲遊戲結束。
如果遊戲結束,玩家不允許再放置字符。
示例 1:
輸入: board = ["O ", " ", " "]
輸出: false
解釋: 第一個玩家總是放置“X”。

示例 2:
輸入: board = [“XOX”, " X ", " "]
輸出: false
解釋: 玩家應該是輪流放置的。

示例 3:
輸入: board = [“XXX”, " ", “OOO”]
輸出: false

示例 4:
輸入: board = [“XOX”, “O O”, “XOX”]
輸出: true
說明:

遊戲板 board 是長度爲 3 的字符串數組,其中每個字符串 board[i] 的長度爲 3。
board[i][j] 是集合 {" ", “X”, “O”} 中的一個字符。

class Solution {
    public boolean validTicTacToe(String[] board) {
        int countX = 0;
        int countO = 0;
        char[][] chars = new char[3][3];
        chars[0] = board[0].toCharArray();
        chars[1] = board[1].toCharArray();
        chars[2] = board[2].toCharArray();
        for (char[] ca : chars) {
            for (char c : ca) {
                if (c == 'X') {
                    countX++;
                }
                if (c == 'O') {
                    countO++;
                }
            }
        }
        if (countO > countX || countX - countO > 1) {
            return false;
        }

        //相等的時候說明最後一步是0走的,X不可能贏
        if (countX == countO && hasSuccess(chars, 'X')) {
            return false;
        }

        //大於1的時候說明最後一步是X走的,0不可能贏
        if (countX - countO == 1 && hasSuccess(chars, 'O')) {
            return false;
        }
        return true;
    }

    private boolean hasSuccess(char[][] chars, char c) {
        //橫着三排
        if (chars[0][0] == c && chars[0][1] == c && chars[0][2] == c) {
            return true;
        }
        if (chars[1][0] == c && chars[1][1] == c && chars[1][2] == c) {
            return true;
        }

        if (chars[1][0] == c && chars[2][1] == c && chars[2][2] == c) {
            return true;
        }
        //豎着三排
        if (chars[0][0] == c && chars[1][0] == c && chars[2][0] == c) {
            return true;
        }
        if (chars[0][1] == c && chars[1][1] == c && chars[2][1] == c) {
            return true;
        }
        if (chars[0][2] == c && chars[1][2] == c && chars[2][2] == c) {
            return true;
        }
        //斜着兩個
        if (chars[0][0] == c && chars[1][1] == c && chars[2][2] == c) {
            return true;
        }
        if (chars[0][2] == c && chars[1][1] == c && chars[2][0] == c) {
            return true;
        }
        return false;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章