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.
This is a simple problem on DFS Method
public class Solution { public void solveSudoku(char[][] board){ List<Integer> blankCells = new ArrayList<Integer>();//a sudoku board is a 9 by 9 arrayfor(int i = 0; i < 81; ++i){ if(board[i / 9][ i % 9 ] == ‘.‘)blankCells.add(i);}dfs(board, 0, blankCells); }private boolean dfs(char[][] board, int start, List<Integer> blankCells) {if(start == blankCells.size()) return true; //dfs reaches the end//get the coordinates of the cell to be filledint currentCoordinate = blankCells.get(start);int row = currentCoordinate / 9;int column = currentCoordinate % 9;//fill a number in the cellfor(int num = 1; num < 10; ++num) {//check the sudoku is valid after being filled numif(isValid(num, board,row,column)) {board[row][column] = (char)(num + ‘0‘);if(dfs(board,start + 1, blankCells))return true;//if a solution can not be reached after the filling, we need to erase the filling for next tryboard[row][column] = ‘.‘;}}return false;}private boolean isValid(int num, char[][] board, int row, int column) {//check whether num is in the row, column and gridfor(int i = 0; i < 9; ++i){if(board[row][i] -‘0‘ == num) return false; //row if(board[i][column] - ‘0‘ == num) return false; //columnif(board[3 *(row / 3) + i / 3][3 * (column / 3) + i % 3] - ‘0‘ == num) return false;}return true; }}