leecode更新

This commit is contained in:
markilue 2023-02-03 22:02:06 +08:00
parent 1104f87ef2
commit 5b48986cff
2 changed files with 105 additions and 1 deletions

View File

@ -20,7 +20,7 @@ import java.util.List;
* 数独部分空格内已填入了数字空白格用 '.' 表示 * 数独部分空格内已填入了数字空白格用 '.' 表示
* @Version: 1.0 * @Version: 1.0
*/ */
public class SolveSudoku { public class T14_SolveSudoku {
@Test @Test
public void test() { public void test() {

View File

@ -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;
}
}