leecode更新
This commit is contained in:
parent
1104f87ef2
commit
5b48986cff
|
|
@ -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() {
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue