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;
}
}