|
| 1 | +/** |
| 2 | + * [36] 有效的数独 |
| 3 | + * |
| 4 | + * 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 |
| 5 | + * <ol> |
| 6 | + * 数字 1-9 在每一行只能出现一次。 |
| 7 | + * 数字 1-9 在每一列只能出现一次。 |
| 8 | + * 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) |
| 9 | + * </ol> |
| 10 | + * |
| 11 | + * 注意: |
| 12 | + * |
| 13 | + * 一个有效的数独(部分已被填充)不一定是可解的。 |
| 14 | + * 只需要根据以上规则,验证已经填入的数字是否有效即可。 |
| 15 | + * 空白格用 '.' 表示。 |
| 16 | + * |
| 17 | + * |
| 18 | + * 示例 1: |
| 19 | + * <img src="https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2021/04/12/250px-sudoku-by-l2g-20050714svg.png" style="height:250px; width:250px" /> |
| 20 | + * 输入:board = |
| 21 | + * [["5","3",".",".","7",".",".",".","."] |
| 22 | + * ,["6",".",".","1","9","5",".",".","."] |
| 23 | + * ,[".","9","8",".",".",".",".","6","."] |
| 24 | + * ,["8",".",".",".","6",".",".",".","3"] |
| 25 | + * ,["4",".",".","8",".","3",".",".","1"] |
| 26 | + * ,["7",".",".",".","2",".",".",".","6"] |
| 27 | + * ,[".","6",".",".",".",".","2","8","."] |
| 28 | + * ,[".",".",".","4","1","9",".",".","5"] |
| 29 | + * ,[".",".",".",".","8",".",".","7","9"]] |
| 30 | + * 输出:true |
| 31 | + * |
| 32 | + * 示例 2: |
| 33 | + * |
| 34 | + * 输入:board = |
| 35 | + * [["8","3",".",".","7",".",".",".","."] |
| 36 | + * ,["6",".",".","1","9","5",".",".","."] |
| 37 | + * ,[".","9","8",".",".",".",".","6","."] |
| 38 | + * ,["8",".",".",".","6",".",".",".","3"] |
| 39 | + * ,["4",".",".","8",".","3",".",".","1"] |
| 40 | + * ,["7",".",".",".","2",".",".",".","6"] |
| 41 | + * ,[".","6",".",".",".",".","2","8","."] |
| 42 | + * ,[".",".",".","4","1","9",".",".","5"] |
| 43 | + * ,[".",".",".",".","8",".",".","7","9"]] |
| 44 | + * 输出:false |
| 45 | + * 解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。 |
| 46 | + * |
| 47 | + * 提示: |
| 48 | + * |
| 49 | + * board.length == 9 |
| 50 | + * board[i].length == 9 |
| 51 | + * board[i][j] 是一位数字(1-9)或者 '.' |
| 52 | + * |
| 53 | + */ |
| 54 | +pub struct Solution {} |
| 55 | + |
| 56 | +// problem: https://leetcode.cn/problems/valid-sudoku/ |
| 57 | +// discuss: https://leetcode.cn/problems/valid-sudoku/discuss/?currentPage=1&orderBy=most_votes&query= |
| 58 | + |
| 59 | +// submission codes start here |
| 60 | + |
| 61 | +impl Solution { |
| 62 | + pub fn is_valid_sudoku(board: Vec<Vec<char>>) -> bool { |
| 63 | + for row in &board { |
| 64 | + let mut exists = vec![0u8; 10]; |
| 65 | + for c in row { |
| 66 | + if *c != '.' { |
| 67 | + let c = *c as usize - '0' as usize; |
| 68 | + if exists[c] > 0 { |
| 69 | + return false; |
| 70 | + } |
| 71 | + exists[c] = 1; |
| 72 | + } |
| 73 | + } |
| 74 | + } |
| 75 | + |
| 76 | + for col in (0..9) { |
| 77 | + let mut exists = vec![0u8; 10]; |
| 78 | + for i in (0..9) { |
| 79 | + let c = &board[i][col]; |
| 80 | + if *c != '.' { |
| 81 | + let c = *c as usize - '0' as usize; |
| 82 | + if exists[c] > 0 { |
| 83 | + return false; |
| 84 | + } |
| 85 | + exists[c] = 1; |
| 86 | + } |
| 87 | + } |
| 88 | + } |
| 89 | + |
| 90 | + for i in (0..9).step_by(3) { |
| 91 | + for j in (0..9).step_by(3) { |
| 92 | + let mut exists = vec![0u8; 10]; |
| 93 | + for m in (i..i + 3) { |
| 94 | + for n in (j..j + 3) { |
| 95 | + let c = board[m][n]; |
| 96 | + if c == '.' { |
| 97 | + continue; |
| 98 | + } |
| 99 | + let c = c as usize - '0' as usize; |
| 100 | + if exists[c] > 0 { |
| 101 | + return false; |
| 102 | + } |
| 103 | + exists[c] = 1; |
| 104 | + } |
| 105 | + } |
| 106 | + } |
| 107 | + } |
| 108 | + true |
| 109 | + } |
| 110 | +} |
| 111 | + |
| 112 | +// submission codes end |
| 113 | + |
| 114 | +#[cfg(test)] |
| 115 | +mod tests { |
| 116 | + use super::*; |
| 117 | + |
| 118 | + #[test] |
| 119 | + fn test_36() { |
| 120 | + assert_eq!( |
| 121 | + Solution::is_valid_sudoku(vec![ |
| 122 | + vec!['5', '3', '.', '.', '7', '.', '.', '.', '.'], |
| 123 | + vec!['6', '.', '.', '1', '9', '5', '.', '.', '.'], |
| 124 | + vec!['.', '9', '8', '.', '.', '.', '.', '6', '.'], |
| 125 | + vec!['8', '.', '.', '.', '6', '.', '.', '.', '3'], |
| 126 | + vec!['4', '.', '.', '8', '.', '3', '.', '.', '1'], |
| 127 | + vec!['7', '.', '.', '.', '2', '.', '.', '.', '6'], |
| 128 | + vec!['.', '6', '.', '.', '.', '.', '2', '8', '.'], |
| 129 | + vec!['.', '.', '.', '4', '1', '9', '.', '.', '5'], |
| 130 | + vec!['.', '.', '.', '.', '8', '.', '.', '7', '9'], |
| 131 | + ]), |
| 132 | + true |
| 133 | + ); |
| 134 | + assert_eq!( |
| 135 | + Solution::is_valid_sudoku(vec![ |
| 136 | + vec!['8', '3', '.', '.', '7', '.', '.', '.', '9'], |
| 137 | + vec!['6', '.', '.', '1', '9', '5', '.', '.', '.'], |
| 138 | + vec!['.', '9', '8', '.', '.', '.', '.', '6', '.'], |
| 139 | + vec!['8', '.', '.', '.', '6', '.', '.', '.', '3'], |
| 140 | + vec!['4', '.', '.', '8', '.', '3', '.', '.', '1'], |
| 141 | + vec!['7', '.', '.', '.', '2', '.', '.', '.', '6'], |
| 142 | + vec!['.', '6', '.', '.', '.', '.', '2', '8', '.'], |
| 143 | + vec!['.', '.', '.', '4', '1', '9', '.', '.', '5'], |
| 144 | + vec!['.', '.', '.', '.', '8', '.', '.', '7', '9'], |
| 145 | + ]), |
| 146 | + false |
| 147 | + ); |
| 148 | + } |
| 149 | +} |
0 commit comments