难度困难1185收藏分享切换为英文接收动态反馈
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.'
表示。
示例 1:
输入: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]
是一位数字或者'.'
- 题目数据 保证 输入数独仅有一个解
- 题目链接:力扣https://leetcode-cn.com/problems/sudoku-solver/
使用回溯
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
SolutionTest solution = new SolutionTest();
solution.solveSudoku(new char[][]
{
{'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'}
});
}
}
class SolutionTest {
public void solveSudoku(char[][] board) {
flag = true;
dfs(board,0,0);
}
boolean flag = true;
public void dfs(char[][] board,int x,int y){
if(flag == false)return;
if(x == 9){
print(board);
flag = false;
return;
}
if(board[x][y] == '.'){
for(int i =1;i<=9;i++){
if(flag == false)return;
board[x][y] = (char)('0'+i);
if(check(board,x,y)){
dfs(board,(x+((y+1)/9)),((y+1)%9));
}
}
if(flag == false)return;
board[x][y] = '.';
}
else{
dfs(board,(x+((y+1)/9)),((y+1)%9));
}
}
public boolean check(char[][] board,int x,int y){
int n = board.length;
int m = board[0].length;
//纵
for(int i =0;i<n;i++){
if(i!=x && board[i][y] == board[x][y])return false;
}
//横
for(int i = 0;i<m;i++){
if(i!=y && board[x][i] == board[x][y])return false;
}
//9宫格
int startX = x/3*3;
int startY = y/3*3;
for(int i = startX;i<startX+3;i++){
for(int j = startY;j<startY+3;j++){
if(i!=x && j!= y && board[i][j] == board[x][y])return false;
}
}
return true;
}
public void print(char[][] board){
for(char[] c : board){
System.out.println(Arrays.toString(c));
}
}
}