当前位置: 面试刷题>> 合法的井字棋状态 (经典算法题500道)
### 题目描述补充
题目:合法的井字棋状态判断
井字棋(Tic-Tac-Toe)是一个两人参与的游戏,在3x3的棋盘上轮流放置棋子,通常是X和O,首先连成一行、一列或对角线三个相同棋子的玩家获胜。现在给定一个3x3的棋盘状态(由'.'表示空格,'X'和'O'表示棋子),请判断该状态是否是一个合法的井字棋游戏状态,即满足以下条件:
1. 棋盘大小为3x3。
2. 每个格子只能被'X'、'O'或'.'(空格)占据。
3. 双方玩家轮流放置棋子,所以X和O的数量之差不能超过1(在棋盘未满的情况下),或者在棋盘已满且平局的情况下,X和O的数量相等。
### 示例代码
以下是分别用PHP、Python和JavaScript编写的示例代码,用于判断给定的井字棋状态是否合法。
#### PHP
```php
function isValidTicTacToe($board) {
$counts = ['X' => 0, 'O' => 0, '.' => 0];
foreach ($board as $row) {
if (count($row) !== 3) {
return false; // 棋盘大小不是3x3
}
foreach ($row as $cell) {
if (!isset($counts[$cell])) {
return false; // 非法字符
}
$counts[$cell]++;
}
}
$diff = abs($counts['X'] - $counts['O']);
if (($counts['.'] == 0 && $diff != 0) || ($counts['.'] != 0 && $diff > 1)) {
return false; // 棋盘已满且X和O数量不等,或棋盘未满且X和O数量差超过1
}
return true;
}
// 示例用法
$board = [
['X', 'O', 'X'],
['O', 'X', 'O'],
['X', 'O', 'X']
];
echo isValidTicTacToe($board) ? "合法" : "不合法";
```
#### Python
```python
def isValidTicTacToe(board):
counts = {'X': 0, 'O': 0, '.': 0}
for row in board:
if len(row) != 3:
return False # 棋盘大小不是3x3
for cell in row:
if cell not in counts:
return False # 非法字符
counts[cell] += 1
diff = abs(counts['X'] - counts['O'])
if (counts['.'] == 0 and diff != 0) or (counts['.'] != 0 and diff > 1):
return False # 棋盘已满且X和O数量不等,或棋盘未满且X和O数量差超过1
return True
# 示例用法
board = [
['X', 'O', 'X'],
['O', 'X', 'O'],
['X', 'O', 'X']
]
print("合法" if isValidTicTacToe(board) else "不合法")
```
#### JavaScript
```javascript
function isValidTicTacToe(board) {
const counts = {'X': 0, 'O': 0, '.': 0};
for (const row of board) {
if (row.length !== 3) {
return false; // 棋盘大小不是3x3
}
for (const cell of row) {
if (!(cell in counts)) {
return false; // 非法字符
}
counts[cell]++;
}
}
const diff = Math.abs(counts['X'] - counts['O']);
if ((counts['.'] === 0 && diff !== 0) || (counts['.'] !== 0 && diff > 1)) {
return false; // 棋盘已满且X和O数量不等,或棋盘未满且X和O数量差超过1
}
return true;
}
// 示例用法
const board = [
['X', 'O', 'X'],
['O', 'X', 'O'],
['X', 'O', 'X']
];
console.log(isValidTicTacToe(board) ? "合法" : "不合法");
```
**码小课**网站中有更多关于算法和数据结构的学习内容,包括各种经典问题的详细解析和示例代码,欢迎大家前去学习交流。