137 lines
5.0 KiB
Java
137 lines
5.0 KiB
Java
//编写一个程序,通过填充空格来解决数独问题。
|
||
//
|
||
// 数独的解法需 遵循如下规则:
|
||
//
|
||
//
|
||
// 数字 1-9 在每一行只能出现一次。
|
||
// 数字 1-9 在每一列只能出现一次。
|
||
// 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
|
||
//
|
||
//
|
||
// 数独部分空格内已填入了数字,空白格用 '.' 表示。
|
||
//
|
||
//
|
||
//
|
||
//
|
||
//
|
||
//
|
||
// 示例:
|
||
//
|
||
//
|
||
//输入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5","."
|
||
//,".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".","."
|
||
//,"3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"
|
||
//],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],["
|
||
//.",".",".",".","8",".",".","7","9"]]
|
||
//输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"
|
||
//],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["
|
||
//4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","
|
||
//6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","
|
||
//5","2","8","6","1","7","9"]]
|
||
//解释:输入的数独如上图所示,唯一有效的解决方案如下所示:
|
||
//
|
||
//
|
||
//
|
||
//
|
||
//
|
||
//
|
||
// 提示:
|
||
//
|
||
//
|
||
// board.length == 9
|
||
// board[i].length == 9
|
||
// board[i][j] 是一位数字或者 '.'
|
||
// 题目数据 保证 输入数独仅有一个解
|
||
//
|
||
//
|
||
//
|
||
//
|
||
// Related Topics 哈希表 回溯算法
|
||
// 👍 819 👎 0
|
||
|
||
package leetcode.editor.cn;
|
||
|
||
import java.util.*;
|
||
|
||
//37:解数独
|
||
public class SudokuSolver {
|
||
public static void main(String[] args) {
|
||
//测试代码
|
||
Solution solution = new SudokuSolver().new Solution();
|
||
}
|
||
|
||
//力扣代码
|
||
//leetcode submit region begin(Prohibit modification and deletion)
|
||
class Solution {
|
||
public void solveSudoku(char[][] board) {
|
||
List<Integer>[][] boards = new ArrayList[9][9];
|
||
List<Integer>[] rows = new ArrayList[9];
|
||
List<Integer>[] columns = new ArrayList[9];
|
||
List<Integer>[] others = new ArrayList[9];
|
||
for (int i = 0; i < 9; i++) {
|
||
for (int j = 0; j < 9; j++) {
|
||
boards[i][j] = new ArrayList<>();
|
||
}
|
||
rows[i] = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
|
||
columns[i] = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
|
||
others[i] = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
|
||
}
|
||
List<List<Integer>> left = new ArrayList<>();
|
||
for (int i = 0; i < 9; i++) {
|
||
for (int j = 0; j < 9; j++) {
|
||
char ch = board[i][j];
|
||
if (ch == '.') {
|
||
left.add(Arrays.asList(i, j));
|
||
continue;
|
||
}
|
||
rows[i].remove(ch - '0');
|
||
columns[j].remove(ch - '0');
|
||
int otherIndex = (i / 3) * 3 + j / 3;
|
||
others[otherIndex].remove(ch - '0');
|
||
}
|
||
}
|
||
while (left.size() > 0) {
|
||
for (int i = 0; i < left.size(); i++) {
|
||
List<Integer> list = left.get(i);
|
||
int r = 0, c = 0, o = 0;
|
||
int x = list.get(0),y = list.get(1);
|
||
List<Integer> tempR = rows[x];
|
||
List<Integer> tempC = columns[y];
|
||
int otherIndex = (x / 3) * 3 + y / 3;
|
||
List<Integer> tempO = others[otherIndex];
|
||
while (r < tempR.size() && c < tempC.size() && o < tempO.size()) {
|
||
if(tempR.get(r).equals(tempC.get(c)) && tempC.get(c).equals(tempO.get(o))){
|
||
boards[x][y].add(tempC.get(c));
|
||
}
|
||
while (tempR.get(r)<tempC.get(c)){
|
||
tempR.remove(r);
|
||
}
|
||
while (tempC.get(c)<tempR.get(r)){
|
||
tempC.remove(c);
|
||
}
|
||
while (tempO.get(o)<tempC.get(c)){
|
||
tempO.remove(o);
|
||
}
|
||
while (tempC.get(c)<tempO.get(o)){
|
||
tempC.remove(c);
|
||
}
|
||
while (tempO.get(o)<tempR.get(r)){
|
||
tempO.remove(o);
|
||
}
|
||
while (tempR.get(r)<tempO.get(o)){
|
||
tempR.remove(r);
|
||
}
|
||
}
|
||
if(boards[x][y].size()==1){
|
||
board[x][y] = Character.forDigit(boards[x][y].get(0),10);
|
||
rows[x].remove(board[x][y] - '0');
|
||
columns[y].remove(board[x][y] - '0');
|
||
others[otherIndex].remove(board[x][y] - '0');
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//leetcode submit region end(Prohibit modification and deletion)
|
||
|
||
} |