题目
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 9 3x3 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.
回溯
N皇后问题跟这题解数独都是经典的回溯算法,直接套用回溯算法的框架,注意一些边界情况即可。
Java代码
class Solution {
public void solveSudoku(char[][] board) {
backtrack(board,0,0);
}
public boolean backtrack(char[][] board,int i,int j){
int m=9,n=9;
if(j==n){
return backtrack(board,i+1,0);
}
if(i==m){
return true;
}
if(board[i][j]!='.'){
return backtrack(board,i,j+1);
}
for(char ch='1';ch<='9';ch++){
if(!isValid(board,i,j,ch)){
continue;
}
board[i][j]=ch;
if(backtrack(board,i,j+1)) return true;
board[i][j]='.';
}
return false;
}
public boolean isValid(char[][] board,int r,int c,char n){
for(int i=0;i<9;i++){
if(board[r][i]==n) return false;
if(board[i][c]==n) return false;
if(board[(r/3)*3+i/3][(c/3)*3+i%3]==n) return false;
}
return true;
}
}