題目:給定一個數獨,某些部分已經被填上了數字,其余空的地方用‘.’表示;判斷給定的數獨是否有效;
數獨規則: 每一行不能有重復的數字;每一列不能有重復的數字;將數獨框划分為三行三列,沒9個小方格不能有重復;

解題思路:
該題目不要判斷整個數獨是否有解,只需要判斷當前給出的數獨是否有效。因此只需要判斷行和列是否有效,判斷每個塊是否有效。而判斷一行中是否有重復的數字,最好的數據結構莫過於Set結構了。
使用rowSet,colSet兩個Set結構來分別保存當前遍歷的行和列,(i, j)表示行,則(j, i)就表示列。因此可以在判斷第一行是否有效的同時,順便判斷第一列是否有效;塊單獨做檢查;
代碼如下:
1 public class Solution { 2 public boolean isValidSudoku(char[][] board) { 3 if(board == null || board.length < 9 || board[0].length < 9) 4 return false; 5 Set<Character> rowset = new HashSet<Character>(); 6 Set<Character> colset = new HashSet<Character>(); 7 8 for(int i = 0; i < 9; i++) 9 { 10 rowset.clear(); 11 colset.clear(); 12 for(int j = 0; j < 9; j ++) 13 { 14 if(i % 3 == 0 && j % 3 == 0) // 檢查塊是否有效 15 { 16 if(!checkBlock(board, i, j)) 17 return false; 18 } 19 if(board[i][j] != '.') // 檢查行是否有效 20 { 21 if(rowset.contains(board[i][j])) 22 return false; 23 rowset.add(board[i][j]); 24 } 25 if(board[j][i] != '.') // 檢查列是否有效 26 { 27 if(colset.contains(board[j][i])) 28 return false; 29 colset.add(board[j][i]); 30 } 31 } 32 } 33 return true; 34 35 } 36 public boolean checkBlock(char[][] board, int row, int col) // 檢查塊是否有效 37 { 38 Set<Character> blockSet = new HashSet<Character>(); 39 for(int i = row; i < row + 3; i++) 40 { 41 for(int j = col; j < col + 3; j++) 42 { 43 if(board[i][j] != '.') 44 { 45 if(blockSet.contains(board[i][j])) 46 return false; 47 blockSet.add(board[i][j]); 48 } 49 } 50 } 51 return true; 52 } 53 }
