Skip to content

Commit be94734

Browse files
committed
一刷794
1 parent 489978e commit be94734

File tree

8 files changed

+148
-43
lines changed

8 files changed

+148
-43
lines changed

README.adoc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5583,14 +5583,14 @@ TIP: **公众号的微信号是: `jikerizhi`**。__因为众所周知的原因
55835583
//|{doc_base_url}/0793-preimage-size-of-factorial-zeroes-function.adoc[题解]
55845584
//|Hard
55855585
//|
5586-
//
5587-
//|{counter:codes}
5588-
//|{leetcode_base_url}/valid-tic-tac-toe-state/[794. Valid Tic-Tac-Toe State^]
5589-
//|{source_base_url}/_0794_ValidTicTacToeState.java[Java]
5590-
//|{doc_base_url}/0794-valid-tic-tac-toe-state.adoc[题解]
5591-
//|Medium
5592-
//|
5593-
//
5586+
5587+
|{counter:codes}
5588+
|{leetcode_base_url}/valid-tic-tac-toe-state/[794. Valid Tic-Tac-Toe State^]
5589+
|{source_base_url}/_0794_ValidTicTacToeState.java[Java]
5590+
|{doc_base_url}/0794-valid-tic-tac-toe-state.adoc[题解]
5591+
|Medium
5592+
|
5593+
55945594
//|{counter:codes}
55955595
//|{leetcode_base_url}/number-of-subarrays-with-bounded-maximum/[795. Number of Subarrays with Bounded Maximum^]
55965596
//|{source_base_url}/_0795_NumberOfSubarraysWithBoundedMaximum.java[Java]
Lines changed: 62 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,84 @@
11
[#0794-valid-tic-tac-toe-state]
2-
= 794. Valid Tic-Tac-Toe State
2+
= 794. 有效的井字游戏
33

4-
{leetcode}/problems/valid-tic-tac-toe-state/[LeetCode - Valid Tic-Tac-Toe State^]
4+
https://leetcode.cn/problems/valid-tic-tac-toe-state/[LeetCode - 794. 有效的井字游戏 ^]
55

6-
A Tic-Tac-Toe board is given as a string array `board`. Return True if and only if it is possible to reach this board position during the course of a valid tic-tac-toe game.
6+
给你一个字符串数组 `board` 表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到 `board` 所显示的状态时,才返回 `true`
77

8-
The `board` is a 3 x 3 array, and consists of characters `" "`, `"X"`, and `"O"`. The " " character represents an empty square.
8+
井字游戏的棋盘是一个 `3 x 3` 数组,由字符 `' '``'X'``'O'` 组成。字符 `' '` 代表一个空位。
99

10-
Here are the rules of Tic-Tac-Toe:
10+
以下是井字游戏的规则:
1111

12+
* 玩家轮流将字符放入空位(`' '`)中。
13+
* 玩家 1 总是放字符 `'X'` ,而玩家 2 总是放字符 `'O'`
14+
* `'X'``'O'` 只允许放置在空位中,不允许对已放有字符的位置进行填充。
15+
* 当有 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束。
16+
* 当所有位置非空时,也算为游戏结束。
17+
* 如果游戏结束,玩家不允许再放置字符。
1218
13-
* Players take turns placing characters into empty squares (" ").
14-
* The first player always places "X" characters, while the second player always places "O" characters.
15-
* "X" and "O" characters are always placed into empty squares, never filled ones.
16-
* The game ends when there are 3 of the same (non-empty) character filling any row, column, or diagonal.
17-
* The game also ends if all squares are non-empty.
18-
* No more moves can be played if the game is over.
19+
*示例 1:*
1920

21+
image::images/0794-01.jpg[{image_attr}]
2022

21-
[subs="verbatim,quotes,macros"]
22-
----
23-
*Example 1:*
24-
*Input:* board = ["O ", " ", " "]
25-
*Output:* false
26-
*Explanation:* The first player always plays "X".
27-
28-
*Example 2:*
29-
*Input:* board = ["XOX", " X ", " "]
30-
*Output:* false
31-
*Explanation:* Players take turns making moves.
32-
33-
*Example 3:*
34-
*Input:* board = ["XXX", " ", "OOO"]
35-
*Output:* false
36-
37-
*Example 4:*
38-
*Input:* board = ["XOX", "O O", "XOX"]
39-
*Output:* true
40-
----
23+
....
24+
输入:board = ["O "," "," "]
25+
输出:false
26+
解释:玩家 1 总是放字符 "X" 。
27+
....
28+
29+
*示例 2:*
30+
31+
image::images/0794-02.jpg[{image_attr}]
32+
33+
....
34+
输入:board = ["XOX"," X "," "]
35+
输出:false
36+
解释:玩家应该轮流放字符。
37+
....
38+
39+
*示例 3:*
4140

42-
*Note:*
41+
image::images/0794-03.jpg[{image_attr}]
4342

43+
....
44+
输入:board = ["XOX","O O","XOX"]
45+
输出:true
46+
....
4447

45-
* `board` is a length-3 array of strings, where each string `board[i]` has length 3.
46-
* Each `board[i][j]` is a character in the set `{" ", "X", "O"}`.
48+
*提示:*
4749

50+
* `board.length == 3`
51+
* `board[i].length == 3`
52+
* `board[i][j]``'X'``'O'``' '`
4853
4954
5055
56+
== 思路分析
57+
58+
5159
[[src-0794]]
60+
[tabs]
61+
====
62+
一刷::
63+
+
64+
--
5265
[{java_src_attr}]
5366
----
5467
include::{sourcedir}/_0794_ValidTicTacToeState.java[tag=answer]
5568
----
69+
--
70+
71+
// 二刷::
72+
// +
73+
// --
74+
// [{java_src_attr}]
75+
// ----
76+
// include::{sourcedir}/_0794_ValidTicTacToeState_2.java[tag=answer]
77+
// ----
78+
// --
79+
====
80+
81+
82+
== 参考资料
83+
5684

docs/images/0794-01.jpg

5.19 KB
Loading

docs/images/0794-02.jpg

7.43 KB
Loading

docs/images/0794-03.jpg

10.5 KB
Loading

docs/index.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1672,7 +1672,7 @@ include::0787-cheapest-flights-within-k-stops.adoc[leveloffset=+1]
16721672

16731673
// include::0793-preimage-size-of-factorial-zeroes-function.adoc[leveloffset=+1]
16741674

1675-
// include::0794-valid-tic-tac-toe-state.adoc[leveloffset=+1]
1675+
include::0794-valid-tic-tac-toe-state.adoc[leveloffset=+1]
16761676

16771677
// include::0795-number-of-subarrays-with-bounded-maximum.adoc[leveloffset=+1]
16781678

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,11 @@ endif::[]
618618
|{doc_base_url}/0787-cheapest-flights-within-k-stops.adoc[题解]
619619
|⭕️ 深度优先搜索通过 48 / 56 个测试用例。使用带备忘录的深度优先搜索顺利通过。带备忘录的深度优先搜索,也可以优化成动态规划。
620620

621+
|{counter:codes2503}
622+
|{leetcode_base_url}/valid-tic-tac-toe-state/[794. 有效的井字游戏^]
623+
|{doc_base_url}/0794-valid-tic-tac-toe-state.adoc[题解]
624+
|✅ 总结提炼判断规则。
625+
621626

622627
|===
623628

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.diguage.algo.leetcode;
2+
3+
public class _0794_ValidTicTacToeState {
4+
// tag::answer[]
5+
6+
/**
7+
* @author D瓜哥 · https://www.diguage.com
8+
* @since 2025-05-07 21:52:04
9+
*/
10+
public boolean validTicTacToe(String[] board) {
11+
int length = board.length;
12+
char[][] grid = new char[length][length];
13+
int xc = 0, oc = 0;
14+
boolean xRowOver = false;
15+
boolean oRowOver = false;
16+
for (int row = 0; row < length; row++) {
17+
char[] chars = board[row].toCharArray();
18+
int ixc = 0;
19+
int ioc = 0;
20+
for (int column = 0; column < chars.length; column++) {
21+
char c = chars[column];
22+
if (c == 'X') {
23+
xc++;
24+
ixc++;
25+
} else if (c == 'O') {
26+
oc++;
27+
ioc++;
28+
}
29+
grid[row][column] = c;
30+
}
31+
if (!xRowOver && ixc == 3) {
32+
xRowOver = true;
33+
}
34+
if (!oRowOver && ioc == 3) {
35+
oRowOver = true;
36+
}
37+
}
38+
// X 必须比 O 多,但是最多能多一个
39+
// O 不会比 X 多
40+
if (xc - oc > 1 || oc - xc >= 1) {
41+
return false;
42+
}
43+
boolean xColOver = false;
44+
boolean oColOver = false;
45+
for (int i = 0; i < length; i++) {
46+
xColOver = grid[0][i] == 'X' && grid[1][i] == 'X' && grid[2][i] == 'X';
47+
oColOver = grid[0][i] == 'O' && grid[1][i] == 'O' && grid[2][i] == 'O';
48+
if (xColOver || oColOver) {
49+
break;
50+
}
51+
}
52+
boolean xDiagOver = (grid[0][0] == 'X' && grid[1][1] == 'X' && grid[2][2] == 'X')
53+
|| (grid[0][2] == 'X' && grid[1][1] == 'X' && grid[2][0] == 'X');
54+
boolean oDiagOver = (grid[0][0] == 'O' && grid[1][1] == 'O' && grid[2][2] == 'O')
55+
|| (grid[0][2] == 'O' && grid[1][1] == 'O' && grid[2][0] == 'O');
56+
// 如果 X 获胜,则 X 比 O 多一个
57+
if ((xRowOver || xColOver || xDiagOver) && xc - oc != 1) {
58+
return false;
59+
}
60+
// 如果 O 获胜,则 X 与 O 个数相等
61+
if ((oRowOver || oColOver || oDiagOver) && xc != oc) {
62+
return false;
63+
}
64+
return true;
65+
}
66+
67+
// end::answer[]
68+
public static void main(String[] args) {
69+
new _0794_ValidTicTacToeState()
70+
.validTicTacToe(new String[]{"OXX", "XOX", "OXO"});
71+
}
72+
}

0 commit comments

Comments
 (0)