题目描述:
示例 1:
输入: board = ["O ", " ", " "]
输出: false
解释: 第一个玩家总是放置“X”。示例 2:
输入: board = ["XOX", " X ", " "]
输出: false
解释: 玩家应该是轮流放置的。示例 3:
输入: board = ["XXX", " ", "OOO"]
输出: false示例 4:
输入: board = ["XOX", "O O", "XOX"]
输出: true
算法思路:
算法思路简单的将就是枚举出所有返回true的情况,false情况与其想法。
- 首先写一个判断某个字符赢的情况的函数,函数参数为board和字符c,赢得情况需要满足垂直方向,竖直方向,对角方向连续三个相连,其他情况返回false。
- 在validTicTacToe函数中,首先是遍历board中的'X'和'O'的数量。
- 然后处理字符数量不符合的条件(x!=o+1 && x!=o),因为X先出,所以X要么多于O一个,要么和O的数量相同,不满足两者的返回false。
- 处理单个字符胜利的情况,当X胜利时,但数量上不满足x==o+1,返回false,当o胜利时,数量上不满足x==o,返回false。
- 其他情况返回true。
代码实现:
class Solution {
public:
bool validTicTacToe(vector<string>& board) {
//统计board中的o和x的数量
int x=0,o=0;
for(int i=0;i<=2;i++){
for(int j=0;j<=2;j++){
if(board[i][j]=='X'){
x++;
}
if(board[i][j]=='O'){
o++;
}
}
}
//枚举返回false的情况
// 排除数量不对的情况
if(x!=o+1 && x!=o){
return false;
}
// 考虑X或者O获胜,同时满足数量要求,不满足则返回false
if(win(board,'X')&&x!=o+1){
return false;
}
if(win(board,'O')&&x!=o){
return false;
}
//其他情况返回true。
return true;
}
//判赢函数,传入的参数有游戏板board和赢得字符c
bool win(vector<string>& board,char c){
//水平与竖直方向
for(int i=0;i<=2;i++){
if(board[i][0]==c&&board[i][1]==c&&board[i][2]==c){
return true;
}
if(board[0][i]==c&&board[1][i]==c&&board[2][i]==c){
return true;
}
}
//对角线方向
if(board[0][0]==c&&board[1][1]==c&&board[2][2]==c){
return true;
}
if(board[0][2]==c&&board[1][1]==c&&board[2][0]==c){
return true;
}
//其他情况返回false。
return false;
}
};