-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path794-validTicTacToe.go
76 lines (70 loc) · 1.73 KB
/
794-validTicTacToe.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// https://leetcode-cn.com/problems/valid-tic-tac-toe-state/
package main
import "fmt"
/**
* 找出的三条规则
* 1. X 数量num(X) 要么等 num(O), 要么num(X) = num(O) + 1
* 2. 当 X 有直线相同字符时, num(X) = num(O) + 1; 当 O 有直线相同字符时, num(X) = num(O);
* 3. X O 不会同时有直线相同字符
*/
func validTicTacToe(board []string) bool {
num := map[byte]int{
'X': 0,
'O': 0,
}
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if board[i][j] == ' ' {
continue
}
num[board[i][j]]++
}
}
// 规则1
if num['X'] != num['O'] && num['X'] != num['O']+1 {
return false
}
winX, winO := 0, 0
for i := 0; i < 3; i++ {
if board[i][0] == 'X' && board[i][0] == board[i][1] && board[i][0] == board[i][2] ||
board[0][i] == 'X' && board[0][i] == board[1][i] && board[0][i] == board[2][i] {
winX++
}
if board[i][0] == 'O' && board[i][0] == board[i][1] && board[i][0] == board[i][2] ||
board[0][i] == 'O' && board[0][i] == board[1][i] && board[0][i] == board[2][i] {
winO++
}
}
if board[0][0] == board[1][1] && board[0][0] == board[2][2] {
if board[0][0] == 'X' {
winX++
} else if board[0][0] == 'O' {
winO++
}
}
if board[2][0] == board[1][1] && board[2][0] == board[0][2] {
if board[2][0] == 'X' {
winX++
} else if board[2][0] == 'O' {
winO++
}
}
// 规则2、3
if winX >= 1 && (num['X'] != num['O']+1 || winO >= 1) || winO >= 1 && num['X'] != num['O'] {
return false
}
return true
}
func main() {
board := [][]string{
{"O ", " ", " "},
{"XOX", " X ", " "},
{"XXX", " ", "OOO"},
{"XOX", "O O", "XOX"},
{"XXX", "OOX", "OOX"},
{"XXX", "XOO", "OO "},
}
for _, str := range board {
fmt.Println("ret:", validTicTacToe(str))
}
}