Leetcode 794. 有效的井字游戏
题目
用字符串数组作为井字游戏的游戏板 board。当且仅当在井字游戏过程中,玩家有可能将字符放置成游戏板所显示的状态时,才返回 true。
该游戏板是一个 3 x 3 数组,由字符 " ",“X” 和 “O” 组成。字符 " " 代表一个空位。
以下是井字游戏的规则:
- 玩家轮流将字符放入空位(" ")中。
- 第一个玩家总是放字符 “X”,且第二个玩家总是放字符 “O”。
- “X” 和 “O”只允许放置在空位中,不允许对已放有字符的位置进行填充。
- 当有 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束。
- 当所有位置非空时,也算为游戏结束。
- 如果游戏结束,玩家不允许再放置字符。
测试样例
示例 1:
输入: board = ["O ", " ", " "]
输出: false
解释: 第一个玩家总是放置“X”。
示例 2:
输入: board = [“XOX”, " X ", " "]
输出: false
解释: 玩家应该是轮流放置的。
示例 3:
输入: board = [“XXX”, " ", “OOO”]
输出: false
示例 4:
输入: board = [“XOX”, “O O”, “XOX”]
输出: true
说明:
- 游戏板 board 是长度为 3 的字符串数组,其中每个字符串 board[i] 的长度为 3。
- board[i][j] 是集合 {"", “X”, “O”} 中的一个字符。
题解
暴力
先判断是否有效,也就是双方的棋子数应该相同或者X比O多一个
再判断是否有赢棋的一方,也就是每行、每列、主副对角线是否存在1个三种棋子一种。注意赢棋方为X,则必然X比O多一个棋子;赢棋方为O,则必然X、O棋子数相同。且赢棋的情况不能发生在两行或两列
详细过程见代码
代码
bool validTicTacToe(vector<string>& board) {
int cntX=0,cntO=0;
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
if(board[i][j]=='X') cntX++;
else if(board[i][j]=='O') cntO++;
}
}
if(cntX-cntO!=1 && cntX-cntO!=0) return false; //判断是否有效
bool finish = false;
for(int i=0; i<3; i++){ //判断行是否有三子相连
if(board[i][0]!=' ' && board[i][0] == board[i][1] && board[i][1]==board[i][2]){
if(board[i][0] == 'X' && cntX==cntO) return false;
if(board[i][0] == 'O' && cntX>cntO) return false;
if(finish) return false; //赢棋发生在两行
finish = true;
}
}
finish = false;
for(int i=0; i<3; i++){ //判断列是否有三子相连
if(board[0][i]!=' ' && board[0][i] == board[1][i] && board[1][i]==board[2][i]){
if(board[0][i] == 'X' && cntX==cntO) return false;
if(board[0][i] == 'O' && cntX>cntO) return false;
if(finish) return false; //赢棋发生在两列
finish = true;
}
}
if(board[0][0]!=' ' && board[0][0] == board[1][1] && board[1][1]==board[2][2]){ //判断主对角线
if(board[0][0] == 'X' && cntX==cntO) return false;
if(board[0][0] == 'O' && cntX>cntO) return false;
}
if(board[0][2]!=' ' && board[0][2] == board[1][1] && board[1][1]==board[2][0]){ //判断副对角线
if(board[0][2] == 'X' && cntX==cntO) return false;
if(board[0][2] == 'O' && cntX>cntO) return false;
}
return true;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-tic-tac-toe-state
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本文解析了LeetCode上编号为794的题目——有效的井字游戏,介绍了游戏规则及判断游戏状态的有效性。通过检查棋盘上的X和O数量以及是否有获胜者来验证游戏状态是否合理。

4824

被折叠的 条评论
为什么被折叠?



