From 5b48986cff4b1b89ca25fd18d15f8819beb409c4 Mon Sep 17 00:00:00 2001 From: markilue <745518019@qq.com> Date: Fri, 3 Feb 2023 22:02:06 +0800 Subject: [PATCH] =?UTF-8?q?leecode=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...{SolveSudoku.java => T14_SolveSudoku.java} | 2 +- .../backtrace/second/T14_SolveSudoku.java | 104 ++++++++++++++++++ 2 files changed, 105 insertions(+), 1 deletion(-) rename Leecode/src/main/java/com/markilue/leecode/backtrace/{SolveSudoku.java => T14_SolveSudoku.java} (99%) create mode 100644 Leecode/src/main/java/com/markilue/leecode/backtrace/second/T14_SolveSudoku.java diff --git a/Leecode/src/main/java/com/markilue/leecode/backtrace/SolveSudoku.java b/Leecode/src/main/java/com/markilue/leecode/backtrace/T14_SolveSudoku.java similarity index 99% rename from Leecode/src/main/java/com/markilue/leecode/backtrace/SolveSudoku.java rename to Leecode/src/main/java/com/markilue/leecode/backtrace/T14_SolveSudoku.java index 0a81234..d63fbf1 100644 --- a/Leecode/src/main/java/com/markilue/leecode/backtrace/SolveSudoku.java +++ b/Leecode/src/main/java/com/markilue/leecode/backtrace/T14_SolveSudoku.java @@ -20,7 +20,7 @@ import java.util.List; * 数独部分空格内已填入了数字,空白格用 '.' 表示。 * @Version: 1.0 */ -public class SolveSudoku { +public class T14_SolveSudoku { @Test public void test() { diff --git a/Leecode/src/main/java/com/markilue/leecode/backtrace/second/T14_SolveSudoku.java b/Leecode/src/main/java/com/markilue/leecode/backtrace/second/T14_SolveSudoku.java new file mode 100644 index 0000000..1ccb135 --- /dev/null +++ b/Leecode/src/main/java/com/markilue/leecode/backtrace/second/T14_SolveSudoku.java @@ -0,0 +1,104 @@ +package com.markilue.leecode.backtrace.second; + +import org.junit.Test; + +import java.util.Arrays; + +/** + *@BelongsProject: Leecode + *@BelongsPackage: com.markilue.leecode.backtrace.second + *@Author: dingjiawen + *@CreateTime: 2023-02-03 20:35 + *@Description: + * TODO 力扣37题 解数独: + * 编写一个程序,通过填充空格来解决数独问题。 + * 数独的解法需 遵循如下规则: + * 数字 1-9 在每一行只能出现一次。 + * 数字 1-9 在每一列只能出现一次。 + * 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) + * 数独部分空格内已填入了数字,空白格用 '.' 表示。 + *@Version: 1.0 + */ +public class T14_SolveSudoku { + + @Test + public void test() { + char[][] 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'}}; + + solveSudoku(board); + for (int i = 0; i < board.length; i++) { + System.out.println(Arrays.toString(board[i])); + } + } + + public void solveSudoku(char[][] board) { + backtracking(board,0,0); + + } + + public boolean backtracking(char[][] board, int row, int col) { + if (row == board.length) { + return true; + } else if (col == board.length) { + //这一行填完了,填下一行 + return backtracking(board, row + 1, 0); + } else if (board[row][col] != '.') { + //这个位置有数字了,填下一个 + return backtracking(board, row, col + 1); + } + + for (int i = 1; i <= 9; i++) { + //填入board[row][col]的数字i + if (isFit(board, row, col, i)) { + board[row][col] = (char) (i + '0'); + if (backtracking(board, row, col + 1)) { + //返回是true,不用继续遍历了,直接返回 + return true; + } + //false的话重新尝试新数字 + board[row][col] = '.'; + } + } + //全都试完了都不对 + return false; + } + + private boolean isFit(char[][] board, int row, int col, int n) { + // + char num =(char) (n + '0'); + //检查行 + for (int i = 0; i < 9; i++) { + if (board[i][col] == num) { + return false; + } + } + + //检查列 + for (int i = 0; i < 9; i++) { + if (board[row][i] == num) { + return false; + } + } + //检查九宫格 + int baseRow = row - (row % 3); + int baseCol = col - (col % 3); + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (board[baseRow + i][baseCol + j] == num) { + return false; + } + } + } + + return true; + } +}