794. 有效的井字游戏
给你一个字符串数组
board
表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到
board
所显示的状态时,才返回
true
。
井字游戏的棋盘是一个
3 x 3
数组,由字符
' '
,
'X'
和
'O'
组成。字符 ’
'
代表一个空位。
以下是井字游戏的规则:
- 玩家轮流将字符放入空位(’ ‘)中。
- 玩家 1 总是放字符 ‘X’ ,而玩家 2 总是放字符 ‘O’ 。
- ‘X’ 和 ‘O’ 只允许放置在空位中,不允许对已放有字符的位置进行填充。
- 当有 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束。
- 当所有位置非空时,也算为游戏结束。
- 如果游戏结束,玩家不允许再放置字符。
示例 1
:
输入:board = ["O "," "," "]
输出:false
解释:玩家 1 总是放字符 "X" 。
示例 2
:
输入:board = ["XOX"," X "," "]
输出:false
解释:玩家应该轮流放字符。
示例 3
:
输入:board = ["XXX"," ","OOO"]
输出:false
示例 4
:
输入:board = ["XOX","O O","XOX"]
输出:true
方法一:模拟
解题思路
感觉题目表达的不够清晰~
题目的
大意
是:两个人按照题目中给出的规则下棋,现在给定一个棋面,判断这个棋面是不是「合理」的。
那么,一个「合理」的棋面应该是什么样的呢?设棋面上
‘X’
的数量为
XCount
,
‘O’
的数量为
OCount
-
因为
‘X’
先走且双方交替在走,所以只有
XCount == OCount
或
XCount == OCount + 1
两种情况 -
在上面的条件下,如果棋面上有人获胜
-
玩家1获胜,则
XCount == OCount + 1
-
玩家2获胜,则
XCount == OCount
-
玩家1获胜,则
除此之外,其他情况都是「不合理」的~
参考代码
public boolean validTicTacToe(String[] board) {
char[][] cs = new char[3][3];
int XCount = 0, OCount = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
char c = board[i].charAt(j);
if (c == 'X') {
XCount++;
} else if (c == 'O') {
OCount++;
}
cs[i][j] = c;
}
}
if (XCount < OCount || XCount > OCount + 1) {
return false;
}
boolean XWin = checkWin(cs, 'X'), OWin = checkWin(cs, 'O');
if (XWin && XCount <= OCount) {
return false;
}
if (OWin && OCount != XCount) {
return false;
}
return true;
}
public boolean checkWin(char[][] cs, char c) {
if (cs[0][0] == c && cs[1][1] == c && cs[2][2] == c) {
return true;
}
if (cs[0][2] == c && cs[1][1] == c && cs[2][0] == c ) {
return true;
}
for (int i = 0; i < 3; i++) {
if (cs[i][0] == c && cs[i][1] == c && cs[i][2] == c) {
return true;
}
if (cs[0][i] == c && cs[1][i] == c && cs[2][i] == c) {
return true;
}
}
return false;
}
执行结果