lintcode:Valid Sudoku 判斷數獨是否合法


題目:

判斷數獨是否合法

請判定一個數獨是否有效。該數獨可能只填充了部分數字,其中缺少的數字用 . 表示。
樣例
下列就是一個合法數獨的樣例。
注意 一個合法的數獨(僅部分填充)並不一定是可解的。我們僅需使填充的空格有效即可。
說明
什么是 數獨?
http://sudoku.com.au/TheRules.aspx
http://baike.baidu.com/subview/961/10842669.htm
解題:
感覺這很難到不知道如何進行,在這里看到,只需判斷每行,每類,每個小3*3矩陣內的數字是1-9就是合法的,但是這里只填充部分數的,按照上面說,沒有填充的數 認為是該位置是合法的,這里的程序,也是這樣搞的,感覺這不對頭,但是意思是說:只要部分填充的數獨滿足了數獨的條件,一定能填充成數獨。<正確與否,我不確定,但是程序就是這樣寫的,逆推的結論>
Java程序:
 
class Solution {
    /**
      * @param board: the board
        @return: wether the Sudoku is valid
      */
    public boolean isValidSudoku(char[][] board) {
        boolean[] visited = new boolean[9];
        //row 
        for(int i=0;i<9;i++){
            Arrays.fill(visited,false); //填充visited數組中的每個元素都是false 
            for(int j=0;j<9;j++){
                if(!process(visited,board[i][j]))
                    return false;
            }
        }
        
        //col
        for(int i=0;i<9;i++){
            Arrays.fill(visited,false);
            for(int j=0;j<9;j++)
                if(!process(visited,board[j][i]))
                    return false;
        }
        //sub matrix
        for(int i=0;i<9;i+=3)
            for(int j=0;j<9;j+=3){
                Arrays.fill(visited,false);
                for(int k = 0;k<9;k++)
                    if(!process(visited,board[i+ k/3][j + k%3]))
                        return false;
            }
        return true;
    }
    private boolean process(boolean[] visited,char dight){
        if(dight=='.')
            return true;
        int num = dight - '0';
        if(num<1 || num>9 || visited[num-1])
            return false;
        visited[num-1] = true;
        return true;
    }
};
View Code

總耗時: 822 ms

Python程序:

 

class Solution:
    # @param board, a 9x9 2D array
    # @return a boolean
    def isValidSudoku(self, board):
        
        # sub matrix
        for i in range(0,9,3):
            for j in range(0,9,3):
                visited = [False]*9
                for k in range(3):
                    m = i + k 
                    n = j + k 
                    if(self.process(visited,board[m][n])==False):
                        return False 
                        
        # row
        for i in range(9):
            visited = [False]*9
            for j in range(9):
                if(self.process(visited,board[i][j])==False):
                    return False
                    
        # col
        for j in range(9):
            visited = [False]*9
            for i in range(9):
                if(self.process(visited,board[i][j])==False):
                    return False
        
        return True
        
        
    def process(self,visited,digit):
        if digit=='.':
            return True
        num = int(digit)
        if(num<1 or num>9 or visited[num-1]==True):
            return False
        visited[num-1] = True
        return True
View Code

總耗時: 148 ms

在判斷3*3矩陣時候,根據我的這樣方法很簡單的哦

還有就是直判斷行和列是否滿足條件也能AC

所以我把判斷小矩陣是否1-9組成放在了最上面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM