1struct Solution;
2
3use std::collections::HashSet;
4
5impl Solution {
6 fn is_valid_sudoku(board: Vec<Vec<char>>) -> bool {
7 let mut rows: Vec<HashSet<char>> = vec![HashSet::new(); 9];
8 let mut cols: Vec<HashSet<char>> = vec![HashSet::new(); 9];
9 let mut boxes: Vec<HashSet<char>> = vec![HashSet::new(); 9];
10 for i in 0..9 {
11 for j in 0..9 {
12 let c = board[i][j];
13 if c == '.' {
14 continue;
15 }
16 if !rows[i].insert(c) {
17 return false;
18 }
19
20 if !cols[j].insert(c) {
21 return false;
22 }
23
24 let k = (i / 3) * 3 + (j / 3);
25 if !boxes[k].insert(c) {
26 return false;
27 }
28 }
29 }
30 true
31 }
32}
33
34#[test]
35fn test() {
36 let board = vec_vec_char![
37 ['5', '3', '.', '.', '7', '.', '.', '.', '.'],
38 ['6', '.', '.', '1', '9', '5', '.', '.', '.'],
39 ['.', '9', '8', '.', '.', '.', '.', '6', '.'],
40 ['8', '.', '.', '.', '6', '.', '.', '.', '3'],
41 ['4', '.', '.', '8', '.', '3', '.', '.', '1'],
42 ['7', '.', '.', '.', '2', '.', '.', '.', '6'],
43 ['.', '6', '.', '.', '.', '.', '2', '8', '.'],
44 ['.', '.', '.', '4', '1', '9', '.', '.', '5'],
45 ['.', '.', '.', '.', '8', '.', '.', '7', '9']
46 ];
47 assert_eq!(Solution::is_valid_sudoku(board), true);
48 let board = vec_vec_char![
49 ['8', '3', '.', '.', '7', '.', '.', '.', '.'],
50 ['6', '.', '.', '1', '9', '5', '.', '.', '.'],
51 ['.', '9', '8', '.', '.', '.', '.', '6', '.'],
52 ['8', '.', '.', '.', '6', '.', '.', '.', '3'],
53 ['4', '.', '.', '8', '.', '3', '.', '.', '1'],
54 ['7', '.', '.', '.', '2', '.', '.', '.', '6'],
55 ['.', '6', '.', '.', '.', '.', '2', '8', '.'],
56 ['.', '.', '.', '4', '1', '9', '.', '.', '5'],
57 ['.', '.', '.', '.', '8', '.', '.', '7', '9']
58 ];
59 assert_eq!(Solution::is_valid_sudoku(board), false);
60}