題目:
判斷數獨是否合法
請判定一個數獨是否有效。該數獨可能只填充了部分數字,其中缺少的數字用 . 表示。
樣例
下列就是一個合法數獨的樣例。

注意 一個合法的數獨(僅部分填充)並不一定是可解的。我們僅需使填充的空格有效即可。
說明
什么是 數獨?
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; } };
總耗時: 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
總耗時: 148 ms
在判斷3*3矩陣時候,根據我的這樣方法很簡單的哦
還有就是直判斷行和列是否滿足條件也能AC
所以我把判斷小矩陣是否1-9組成放在了最上面