题目描述:
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.
意思就是解一个数独。
public class Sudoku_Solver {
public static void solveSudoku(char[][] board) {
solve(board);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
System.out.print(board[i][j]+" ");
}
System.out.println("\n");
}
}
private static boolean solve(char[][] board) {
for (int i=0; i<9; i++)
{
for (int j=0; j<9; j++)
{
if ('.' == board[i][j])
{
for (int k=1; k<=9; k++)
{
board[i][j] = (char)('0'+k);
//先放置,再判断。比如这里,首先判断当前位置是否为空,如果为空,那么放置一个元素
//检查它是否正确。如果正确,就继续进行下面的递归
//当函数返回错误之后,将刚刚的数值变为空,再进行下一次尝试。
if (check(board, i, j))
if(solve(board))
return true;
board[i][j] = '.';
}
return false;
}
}
}
//所有的位置都已经有数,已经填充结束
return true;
}
private static boolean check(char[][] board, int x, int y) {
//对列进行判断
for (int i=0; i<9; i++)
if (i!=x && board[i][y]==board[x][y])
return false;
//对行进行判断
for (int j = 0; j<9; j++)
if (j!=y && board[x][j]==board[x][y])
return false;
//对九宫格内进行判断
for (int i=3*(x/3); i<3*(x/3+1); i++)
for (int j=3*(y/3); j<3*(y/3+1); j++)
if (i!=x && j!=y && board[i][j]==board[x][y])
return false;
return true;
}
public static void main(String[] args) {
char[][] 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'}};
solveSudoku(board);
}
}