Skip to content

Commit 6799ddf

Browse files
committed
二刷优化37
1 parent 536e575 commit 6799ddf

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed

docs/0037-sudoku-solver.adoc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,15 @@ include::{sourcedir}/_0037_SudokuSolver.java[tag=answer]
5757
include::{sourcedir}/_0037_SudokuSolver_2.java[tag=answer]
5858
----
5959
--
60+
61+
二刷(引入步进)::
62+
+
63+
--
64+
[{java_src_attr}]
65+
----
66+
include::{sourcedir}/_0037_SudokuSolver_21.java[tag=answer]
67+
----
68+
--
6069
====
6170

6271
== 参考资料
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import static com.diguage.util.Printers.printMatrix;
4+
5+
public class _0037_SudokuSolver_21 {
6+
// tag::answer[]
7+
8+
/**
9+
* * @author D瓜哥 · https://www.diguage.com
10+
* * @since 2024-09-11 10:59:08
11+
*/
12+
public void solveSudoku(char[][] board) {
13+
backtracking(board, 0);
14+
}
15+
16+
private boolean backtracking(char[][] board, int step) {
17+
int row = step / board.length;
18+
int column = step % board.length;
19+
for (int r = row; r < board.length; r++) {
20+
for (int c = column; c < board[r].length; c++) {
21+
if (board[r][c] != '.') {
22+
return backtracking(board, step + 1);
23+
}
24+
// 根据限制条件,筛选出可选字符,否则重复判断
25+
char[] chars = selectChars(board, r, c);
26+
for (char sc : chars) {
27+
board[r][c] = sc;
28+
printMatrix(board);
29+
if (backtracking(board, step + 1)) {
30+
return true;
31+
}
32+
board[r][c] = '.';
33+
}
34+
return false;
35+
}
36+
}
37+
return true;
38+
}
39+
40+
private char[] selectChars(char[][] board, int row, int column) {
41+
char[] chars = new char[9];
42+
int length = 9;
43+
for (int i = 0; i < chars.length; i++) {
44+
chars[i] = (char) ('1' + i);
45+
}
46+
for (int i = 0; i < board.length; i++) {
47+
char c = board[i][column];
48+
if (c != '.' && chars[c - '1'] != '.') {
49+
chars[c - '1'] = '.';
50+
length--;
51+
if (length == 0) {
52+
return new char[0];
53+
}
54+
}
55+
}
56+
for (int i = 0; i < board[row].length; i++) {
57+
char c = board[row][i];
58+
if (c != '.' && chars[c - '1'] != '.') {
59+
chars[c - '1'] = '.';
60+
length--;
61+
if (length == 0) {
62+
return new char[0];
63+
}
64+
}
65+
}
66+
row = (row / 3) * 3;
67+
column = (column / 3) * 3;
68+
for (int i = row; i < row + 3; i++) {
69+
for (int j = column; j < column + 3; j++) {
70+
char c = board[i][j];
71+
if (c != '.' && chars[c - '1'] != '.') {
72+
chars[c - '1'] = '.';
73+
length--;
74+
if (length == 0) {
75+
return new char[0];
76+
}
77+
}
78+
}
79+
}
80+
char[] result = new char[length];
81+
for (int i = chars.length - 1; i >= 0; i--) {
82+
if (chars[i] != '.') {
83+
result[--length] = chars[i];
84+
}
85+
}
86+
return result;
87+
}
88+
89+
// end::answer[]
90+
public static void main(String[] args) {
91+
char[][] b1 = {
92+
{'5', '3', '.', '.', '7', '.', '.', '.', '.'},
93+
{'6', '.', '.', '1', '9', '5', '.', '.', '.'},
94+
{'.', '9', '8', '.', '.', '.', '.', '6', '.'},
95+
{'8', '.', '.', '.', '6', '.', '.', '.', '3'},
96+
{'4', '.', '.', '8', '.', '3', '.', '.', '1'},
97+
{'7', '.', '.', '.', '2', '.', '.', '.', '6'},
98+
{'.', '6', '.', '.', '.', '.', '2', '8', '.'},
99+
{'.', '.', '.', '4', '1', '9', '.', '.', '5'},
100+
{'.', '.', '.', '.', '8', '.', '.', '7', '9'}
101+
};
102+
_0037_SudokuSolver_21 solution = new _0037_SudokuSolver_21();
103+
solution.solveSudoku(b1);
104+
printMatrix(b1);
105+
}
106+
}

0 commit comments

Comments
 (0)