Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character '.'
.
You may assume that there will be only one unique solution.
A sudoku puzzle...
...and its solution numbers marked in red.
题目链接:https://leetcode.com/problems/sudoku-solver/
题目分析:直接DFS即可,判断3*3的只需要将当前坐标除3再乘3即可得到其所属的3*3子阵的左上点坐标
题目分析:直接DFS即可,判断3*3的只需要将当前坐标除3再乘3即可得到其所属的3*3子阵的左上点坐标
public class Solution {
public boolean judge(char[][] board, int pos, char ch) {
int x = pos / 9;
int y = pos % 9;
for(int i = 0; i < 9; i ++) {
if(board[i][y] == ch) {
return false;
}
}
for(int j = 0; j < 9; j ++) {
if(board[x][j] == ch) {
return false;
}
}
int xx = x / 3 * 3;
int yy = y / 3 * 3;
for(int i = xx; i < xx + 3; i ++) {
for(int j = yy; j < yy + 3; j ++) {
if(board[i][j] == ch) {
return false;
}
}
}
return true;
}
public boolean DFS(char[][] board, int pos) {
if(pos > 80) {
return true;
}
int x = pos / 9;
int y = pos % 9;
if(board[x][y] != '.') {
if(DFS(board, pos + 1)) {
return true;
}
}
else {
for(char ch = '1'; ch <= '9'; ch ++) {
if(judge(board, pos, ch)) {
board[x][y] = ch;
if(DFS(board, pos + 1)) {
return true;
}
board[x][y] = '.';
}
}
}
return false;
}
public void solveSudoku(char[][] board) {
DFS(board, 0);
}
}