这次抽到的是解数独问题
数独
每九个中不能有重复数字
每一行不能有
每一列不能有
所以我们应该对每个单元格用1-9进行尝试,满足前三个检查可能是正确答案,对每个可能进行递归。
写了一个递归的算法.添加一个返回boolean的函数,确保可以终止递归。这里主要用到了回溯法和递归
public class Solution {
static char[][] sudoku2 ;
public void solveSudoku(char[][] board) {
sudoku2=new char[board.length][board.length];
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
sudoku2[i][j]=board[i][j];
}
}
solve(board);
}
private static boolean solve(char[][] board){
boolean isFound=true;
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board.length; j++) {
if (board[i][j] == '.') {
isFound=false;
int[] temp = new int[board.length + 1];
int[] sum = new int[board.length + 1];
// 检查行
for (int j2 = 0; j2 < board.length; j2++) {
if (board[i][j2] != '.')
temp[board[i][j2] - 48] = -1;
}
// 检查列
for (int k = 0; k < board.length; k++) {
if (board[k][j] != '.')
temp[board[k][j] - 48] = -1;
}
// 检查九宫
int row = getRow(i);
int col = getRow(j);
for (int k = row; k <= row + 2; k++) {
for (int k2 = col; k2 <= col + 2; k2++) {
if (board[k][k2] != '.'){
temp[board[k][k2] - 48] = -1;
}
}
}
for (int k = 1, j1 = 0; k < sum.length; k++) {
if (temp[k] != -1) {
sum[j1++] = k;
}
}
if (sum[0] == 0){
return false;
}
for (int k = 0; sum[k] != 0; k++) {
if (sum[k] == 0)
continue;
board[i][j] = (char) (sum[k] + 48);
for (int i1 = i; i1 < board.length; i1++) {
int offset=-1;
if(i1==i+1)
offset=j;
for (int j1 = j-offset; j1 < board.length; j1++) {
board[i1][j1]=sudoku2[i1][j1];
}
}
if(solve(board)){
return true;
}
}
}
}
}
if (isFound) {
return true ;
}else{
return false;
}
}
public static int getRow(int j) {
return j / 3 * 3;
}
}