037 解数独
题目:
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
一个数独。
答案被标成红色。
Note:
给定的数独序列只包含数字 1-9 和字符 ‘.’ 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
方法:递归回溯法
思路:用一个双for循环遍历每一个值,如果值为.,则对这个点进行从1开始到9开始试填,如果行列方块都没有这个数,则将这个数设为所假设的值,继续递归,如果以一直能递归下去,就直接返回true,如果有错,则回溯到上一步,再进行试填,如果9个数都不行,直接返回false。
代码:
public void solveSudoku(char[][] board) {
if(board==null||board.length==0) return;
solve(board);
}
public boolean solve(char[][] board){
for (int i = 0; i <board.length ; i++) {
for (int j = 0; j <board[0].length ; j++) {
if(board[i][j]=='.'){
//从1到9开始试填
for (char c = '1'; c <='9' ; c++) {
if(isValid(board,i,j,c)){
board[i][j]=c;
if(solve(board)){//进行递归,如果每一次都可以满足,则返回true
return true;
}else{
board[i][j]='.';//返回
}
}
}
return false;
}
}
}
return true;
}
//判断函数
public boolean isValid(char[][] board,int row,int col,char c){
for (int i = 0; i <9 ; i++) {
if(board[i][col]!='.'&&board[i][col]==c) return false;//检查列
if(board[row][i]!='.'&&board[row][i]==c) return false;//检查行
if(board[3*(row/3)+i/3][3*(col/3)+i%3]!='.'
&&board[3*(row/3)+i/3][3*(col/3)+i%3]==c) return false;
}
return true;
}