這次抽到的是解數獨問題
數獨
每九個中不能有重複數字
每一行不能有
每一列不能有
所以我們應該對每個單元格用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;
}
}