题目描述:
代码如下:
class Solution {
public:
bool validTicTacToe(vector<string>& board) {
int x = 0, o = 0; //X与O的数目
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
if(board[i][j] == 'X') x++;
if(board[i][j] == 'O') o++;
}
}
if(x < o || x-o > 1) return false; //X先行,x大于等于o,且差值不超过1
if(x <= 2) return true; //没有连成线的可能,不用进行之后的判断,直接返回
int xl = 0, ol = 0;
for(int i = 0; i < 3; i++){ //检查横竖的连线情况
if(board[i][0] == board[i][1] && board[i][1] == board[i][2]){
if(board[i][0] == 'X') xl++;
if(board[i][0] == 'O') ol++;
}
if(board[0][i] == board[1][i] && board[1][i] == board[2][i]){
if(board[0][i] == 'X') xl++;
if(board[0][i] == 'O') ol++;
}
}
//检查对角的连线情况
if(board[0][0] == board[1][1] && board[1][1] == board[2][2]){
if(board[0][0] == 'X') xl++;
if(board[0][0] == 'O') ol++;
}
if(board[0][2] == board[1][1] && board[1][1] == board[2][0]){
if(board[0][2] == 'X') xl++;
if(board[0][2] == 'O') ol++;
}
if(xl > 1 || ol > 1 || (xl&&ol)) return false; //有1条以上连线,错误
if(xl == 1 && x == o) return false; //X先连成线,O未及时停止,错误
if(ol == 1 && x > o) return false; //O先连成线,X未及时停止,错误
return true;
}
};
个人体会:
题目看了小半天才理解,也没有想出什么好方法,只是一步步排除错误情况。