Write a program to solve a Sudoku puzzle by filling the empty cells.
A sudoku solution must satisfy all of the following rules:
- Each of the digits
1-9
must occur exactly once in each row. - Each of the digits
1-9
must occur exactly once in each column. - Each of the the digits
1-9
must occur exactly once in each of the 93x3
sub-boxes of the grid.
Empty cells are indicated by the character '.'
.
A sudoku puzzle...
...and its solution numbers marked in red.
Note:
- The given board contain only digits
1-9
and the character'.'
. - You may assume that the given Sudoku puzzle will have a single unique solution.
- The given board size is always
9x9
.
暴力解法对每个.的单元格进行可填元素遍历直到符合条件
Map <Character,Character> all = new HashMap<>();
{
all.put('1','1');
all.put('2','2');
all.put('3','3');
all.put('4','4');
all.put('5','5');
all.put('6','6');
all.put('7','7');
all.put('8','8');
all.put('9','9');
}
//在空的*中填写数字 并让他符合要求的条件
public void solveSudoku(char[][] board) {
isSolveSudoku(board,0,0);
}
public boolean isSolveSudoku(char[][] board,int beginIndex,int jIndex) {
for(int i =0;i<board[0].length;i++) {
for(int j=0;j<board.length;j++) {
if(board[i][j] == '.') {
if(board[6][0] == '9') {
System.out.println();
}
if(i==8 && j==6) {
System.out.println();
}
List<Character> tmp = getValid(board,i,j);
if(tmp.isEmpty()) {
return false;
}
for(Character ad:tmp) {
board[i][j] = ad;
if(!isSolveSudoku(board,i,j)) {
board[i][j] = '.';
}else {
return true;
}
}
if(board[i][j] == '.') {
return false;
}else {
return true;
}
}
}
}
return true;
}
public List<Character> getValid(char[][] board,int i,int j){
Map<Character, Character> tmpMap = new HashMap<>(all);
for (int tmp = 0; tmp < board.length; tmp++) {
if (Character.isDigit(board[tmp][j])) {
tmpMap.remove(board[tmp][j]);
}
}
for (int tmp = 0; tmp < board[i].length; tmp++) {
if (Character.isDigit(board[i][tmp])) {
tmpMap.remove(board[i][tmp]);
}
}
int left = (i / 3)*3;
int right = (j / 3)*3;
for (int k = left; k < left + 3; k++) {
for (int l = right; l < right + 3; l++) {
if (Character.isDigit(board[k][l])) {
tmpMap.remove(board[k][l]);
}
}
}
return new ArrayList<>(tmpMap.keySet());
}