给你一个字符串数组 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;
}
}
发表评论