Skip to main content

rustgym/leetcode/
_794_valid_tic_tac_toe_state.rs

1struct Solution;
2
3impl Solution {
4    fn valid_tic_tac_toe(board: Vec<String>) -> bool {
5        let mut a = vec![vec![]; 3];
6        let mut x = 0;
7        let mut o = 0;
8        for (i, row) in board.iter().enumerate() {
9            for c in row.chars() {
10                match c {
11                    'X' => {
12                        x += 1;
13                    }
14                    'O' => {
15                        o += 1;
16                    }
17                    _ => {}
18                }
19                a[i].push(c);
20            }
21        }
22        let win_x = Self::win(&a, 'X');
23        let win_o = Self::win(&a, 'O');
24        x == o + 1 && win_x >= 0 && win_o == 0 || x == o && win_x == 0 && win_o <= 1
25    }
26
27    fn win(board: &[Vec<char>], c: char) -> i32 {
28        let mut rows = vec![0; 3];
29        let mut cols = vec![0; 3];
30        let mut diagonals = vec![0; 2];
31        for i in 0..3 {
32            for j in 0..3 {
33                let v = if board[i][j] == c { 1 } else { 0 };
34                rows[i] += v;
35                cols[j] += v;
36                if i == j {
37                    diagonals[0] += v;
38                }
39                if i + j == 2 {
40                    diagonals[1] += v;
41                }
42            }
43        }
44        let mut sum = 0;
45        if rows.iter().any(|&row| row == 3) {
46            sum += 1;
47        }
48        if cols.iter().any(|&col| col == 3) {
49            sum += 1;
50        }
51        if diagonals.iter().any(|&diagonal| diagonal == 3) {
52            sum += 1;
53        }
54        sum
55    }
56}
57
58#[test]
59fn test() {
60    let board = vec_string!["O  ", "   ", "   "];
61    let res = false;
62    assert_eq!(Solution::valid_tic_tac_toe(board), res);
63    let board = vec_string!["XOX", " X ", "   "];
64    let res = false;
65    assert_eq!(Solution::valid_tic_tac_toe(board), res);
66    let board = vec_string!["XXX", "   ", "OOO"];
67    let res = false;
68    assert_eq!(Solution::valid_tic_tac_toe(board), res);
69    let board = vec_string!["XOX", "O O", "XOX"];
70    let res = true;
71    assert_eq!(Solution::valid_tic_tac_toe(board), res);
72    let board = vec_string!["XXX", "OOX", "OOX"];
73    let res = true;
74    assert_eq!(Solution::valid_tic_tac_toe(board), res);
75}