今天的每日一题:题意如上,解题思路是我们只需要去找false的情况就行
思路大致如下:
-
X和O个数相同
X赢了但是比赛没结束算错误
-
X和O个数不同
分两种情况:
先手大于后手:O赢了或者X比O多两步算错误o赢了:
X比O多两步:
后手大于先手:错误
class Solution {
public boolean validTicTacToe(String[] board) {
//先计数,记录X和O的个数
int x=0,o=0;
for (int i = 0; i < 3; i++) {
for (int i1 = 0; i1 < board[i].length(); i1++) {
if (board[i].charAt(i1)=='X')x++;
else if (board[i].charAt(i1)=='O')o++;
}
}
//两者个数相同时,X赢了没结束算错误
if(x==o){
//判断是否x赢了却没有判定
//注意判定方法,不能三连等于
if (isWinner(board,'X'))return false;
}
if(x!=o){
//后手大于先手,或者先手比后手多下两个直接false
if (o>x||x-o>=2)return false;
if (x>o)if (isWinner(board,'O'))return false;
}
return true;
}
public boolean isWinner(String[] board,char c){
//判断是不是c(X或者O)赢了,X赢得时候,X比O多1,反之相同
if(board[0].charAt(0)==board[1].charAt(1)&&board[1].charAt(1)==board[2].charAt(2)&&board[2].charAt(2)==c){return true;}
if(board[0].charAt(2)==board[1].charAt(1)&&board[1].charAt(1)==board[2].charAt(0)&&board[2].charAt(0)==c){return true;}
for(int i=0;i<3;i++){
if(board[i].charAt(0)==board[i].charAt(1)&&board[i].charAt(1)==board[i].charAt(2)&&board[i].charAt(2)==c){return true;}
if(board[0].charAt(i)==board[1].charAt(i)&&board[1].charAt(i)==board[2].charAt(i)&&board[2].charAt(i)==c){return true;}
}
return false;
}
}