给你一个字符串数组 board 表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到 board 所显示的状态时,才返回 true 。
井字游戏的棋盘是一个 3 x 3 数组,由字符 ’ ',‘X’ 和 ‘O’ 组成。字符 ’ ’ 代表一个空位。
思路: 先统计board中所有X和O的数量
判断有效的条件是:如果是X赢,Xcount-Ocount=1
如果是O赢 ,Ocount-Xcount=0
如果棋盘不成立的话,xcount!=ocount&&xcount-ocount!=1
其次定义一个boolean方法,看棋盘中是否有(X/O)横纵斜成立的情况。
class Solution {
public boolean validTicTacToe(String[] board) {
int xcount=0;
int 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++;
}
if(c=='O'){
ocount++;
}
}
}
//统计出现的次数
if(xcount!=ocount&&xcount-ocount!=1){
return false;
}
if(win(board,"XXX")&&xcount-ocount!=1){
return false;
}
if(win(board,"OOO")&&xcount-ocount!=0){
return false;
}
return true;
}
public boolean win(String[]board,String flag){
//横向赢
for(int i=0;i<3;i++){
if(flag.equals(board[i])){
return true;
}
//竖着赢
if(flag.equals(""+board[0].charAt(i)+board[1].charAt(i)+board[2].charAt(i))){
return true;
}
}
//判断是否斜着赢,在for循环内单独判断。
if(flag.equals(""+board[0].charAt(0)+board[1].charAt(1)+board[2].charAt(2))){
return true;
}
if(flag.equals(""+board[0].charAt(2)+board[1].charAt(1)+board[2].charAt(0))){
return true;
}
return false;
}
}
也可参考另一种代码实现方式
class Solution {
public boolean validTicTacToe(String[] board) {
if(!countDiff(board)){return false;}
if(isWinner(board,'X')&&isWinner(board,'O')){return false;}
if(isWinner(board,'X')&&charCount(board,'X')-charCount(board,'O')!=1){return false;}
if(isWinner(board,'O')&&charCount(board,'X')!=charCount(board,'O')){return false;}
return true;
}
public int charCount(String[] board,char c){
int count=0;
for(int i=0;i<3;i++){for(char ch:board[i].toCharArray()){if(c==ch){count++;}}}
return count;
}
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;
}
public boolean countDiff(String[] board){
//判断X是不是比O多1或者相同
int xNum=0;
int oNum=0;
for(int i=0;i<3;i++){
for(char c:board[i].toCharArray()){
if(c=='X'){xNum++;}
if(c=='O'){oNum++;}
}
}
return xNum-oNum==0||xNum-oNum==1;
}
}



