-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path37.sudoku-solver.rs
78 lines (68 loc) · 2.71 KB
/
37.sudoku-solver.rs
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
77
/*
* @lc app=leetcode id=37 lang=rust
*
* [37] Sudoku Solver
*/
// @lc code=start
use std::collections::HashSet;
use std::char;
impl Solution {
pub fn solve_sudoku(board: &mut Vec<Vec<char>>) {
let s: HashSet<char> = (1..10).map(|x| char::from_digit(x, 10).unwrap()).collect();
let mut row_choices = vec![s.clone(); 9];
let mut col_choices = vec![s.clone(); 9];
let mut sqr_choices = vec![s.clone(); 9];
for i in 0..9 {
for j in 0..9 {
if board[i][j] != '.' {
row_choices[i].remove(&board[i][j]);
col_choices[j].remove(&board[i][j]);
sqr_choices[3 * (i / 3) + (j / 3)].remove(&board[i][j]);
}
}
}
// println!("row: {:?}", row_choices);
// println!("col: {:?}", col_choices);
// println!("sqr: {:?}", sqr_choices);
fn back_track(i: usize, j: usize, board: &mut Vec<Vec<char>>,
row_choices: &mut Vec<HashSet<char>>,
col_choices: &mut Vec<HashSet<char>>,
sqr_choices: &mut Vec<HashSet<char>>
) -> bool {
if i == 9 { return true; }
else if board[i][j] == '.' {
for &ch in row_choices[i].clone().intersection(&col_choices[j].clone()) {
let sqr_idx = 3 * (i / 3) + (j / 3);
if sqr_choices[sqr_idx].clone().contains(&ch) {
board[i][j] = ch;
row_choices[i].remove(&ch);
col_choices[j].remove(&ch);
sqr_choices[sqr_idx].remove(&ch);
let res = if j < 8 {
back_track(i, j+1, board, row_choices, col_choices, sqr_choices)
} else {
back_track(i+1, 0, board, row_choices, col_choices, sqr_choices)
};
if res { return true; }
else {
board[i][j] = '.';
row_choices[i].insert(ch);
col_choices[j].insert(ch);
sqr_choices[sqr_idx].insert(ch);
}
}
}
return false;
} else {
let res = if j < 8 {
back_track(i, j+1, board, row_choices, col_choices, sqr_choices)
} else {
back_track(i+1, 0, board, row_choices, col_choices, sqr_choices)
};
return res;
}
}
back_track(0, 0, board, &mut row_choices, &mut col_choices, &mut sqr_choices);
}
}
// @lc code=end