给你一个字符串数组 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 = ["XOX","O O","XOX"]
输出:true
提示:
board.length == 3
board[i].length == 3
board[i][j]
为 'X'
、'O'
或 ' '
Related Topics
👍 112👎 0
略坑,又臭又长,可以看看
X
、O
数量情况符合 0 <= X
– O
<= 1- 输赢情况判断
X
赢 :X
三连数量为1个或者两个,O
三连数量为0个, 此时因为X
先手,必然有 数量统计结果X
– O
== 1O
赢 : X
三连数量为0个,O
三连数量为1个,因为O
后手,必然有 数量统计结果X
– O
== 0- 两人都还没赢:
X
三连数量为0个,O
三连数量为0个
写二维坐标计算统计太麻烦了,我把board[0] + board[1] + board[2]
拼起来了,
用这样的一维坐标计算统计了
0 1 2
3 4 5
6 7 8
对应为
0 1 2 3 4 5 6 7 8
代码
class Solution {
char X = 'X';
char O = 'O';
public boolean validTicTacToe(String[] board) {
int xCnt = 0;
int oCnt = 0;
String str = board[0] + board[1] + board[2];
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == X){
xCnt++;
}
if (str.charAt(i) == O){
oCnt++;
}
}
if (xCnt - oCnt == 1 || xCnt - oCnt == 0){
int[] res = countLine(str);
if (res[0] >=1 && res[1]==0){
//X赢
// 有个特殊情况,X是可以连成两个3连的
// X X X
// O O X
// O O X
return xCnt - oCnt == 1;
}else if(res[0]==0 && res[1]==1){
//O赢
return xCnt - oCnt == 0;
}else if (res[0] == 0 && res[1] == 0){
//都还没赢 比如
// X O X
// O O
// X O X
return true;
}
}
return false;
}
public int[] countLine(String str){
// 下标转换下,写起来方便
// 0 1 2
// 3 4 5
// 6 7 8
int[][] arr = new int[8][2];
arr[0][0] = charCount(str , X, 0,1,2);
arr[1][0] = charCount(str , X, 3,4,5);
arr[2][0] = charCount(str , X, 6,7,8);
arr[0][1] = charCount(str , O, 0,1,2);
arr[1][1] = charCount(str , O, 3,4,5);
arr[2][1] = charCount(str , O, 6,7,8);
arr[3][0] = charCount(str , X, 0,3,6);
arr[4][0] = charCount(str , X, 1,4,7);
arr[5][0] = charCount(str , X, 2,5,8);
arr[3][1] = charCount(str , O, 0,3,6);
arr[4][1] = charCount(str , O, 1,4,7);
arr[5][1] = charCount(str , O, 2,5,8);
arr[6][0] = charCount(str , X, 0,4,8);
arr[6][1] = charCount(str , O, 0,4,8);
arr[7][0] = charCount(str , X, 2,4,6);
arr[7][1] = charCount(str , O, 2,4,6);
int[] res = new int[2];
for (int[] ints : arr) {
res[0] += ints[0]==3?1:0;
res[1] += ints[1]==3?1:0;
}
return res;
}
public int charCount(String str, char c, int i1, int i2, int i3){
int count = 0;
count += str.charAt(i1)==c? 1 : 0;
count += str.charAt(i2)==c? 1 : 0;
count += str.charAt(i3)==c? 1 : 0;
return count;
}
}
发表评论