Leetcode Sudoku Solver

這次抽到的是解數獨問題
這裏寫圖片描述

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

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章