题目链接
采用分类的思想去解决。
如何分类?
1. **X赢了 X棋子 - O棋子 = 1。穷举**
1. **O赢了 X棋子 - O棋子 = 0。穷举**
1. **胜负未分 X棋子 - O棋子 = 1 ,X棋子 - O棋子 = 0 == 》这两个条件之外就是不可能出现的条件**
四种情况连起来。
class Solution {
// ⅰ. X赢了 X棋子 - O棋子 = 1。穷举
// ⅱ. O赢了 X棋子 - O棋子 = 0。穷举
// ⅲ. 胜负未分 X棋子 - O棋子 = 1 ,X棋子 - O棋子 = 0 == 》这两个条件之外就是不可能出现的条件
public boolean validTicTacToe(String[] board) {
int xCount = 0,oCount = 0;
// 获取X和O棋子的数量
for(String s : board) {
for(char ch : s.toCharArray()) {
if(ch == 'X') {
xCount++;
} else if(ch =='O') {
oCount++;
}
}
}
// 判断胜负未分
if(xCount != oCount && xCount != oCount+1) {
return false;
}
if(xCount == oCount+1 && getWin(board,"OOO")) {
return false;
}
// O赢了
if(xCount == oCount && getWin(board,"OOO") && getWin(board,"XXX")) {
return false;
}
if(xCount == oCount && getWin(board,"XXX")) {
return false;
}
// X赢了
if(xCount == oCount+1 && getWin(board,"XXX")) {
return true;
}
return true;
}
// 找出是否存在赢了的横纵线
public boolean getWin(String[] board, String temp) {
for(int i = 0; i < 3; i++) {
// 横线
if(temp.equals(board[i])) {
return true;
}
// 纵向
if(temp.equals("" + board[0].charAt(i) + board[1].charAt(i) + board[2].charAt(i))) {
return true;
}
}
// 斜线的情况
if(temp.equals("" + board[0].charAt(0)+board[1].charAt(1)+board[2].charAt(2))) {
return true;
}
if(temp.equals("" + board[2].charAt(0)+board[1].charAt(1)+board[0].charAt(2))) {
return true;
}
return false;
}
}