LeetCode 有效的數獨【附帶最笨解題思路】
阿新 • • 發佈:2019-01-23
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
- 數字
1-9
在每一行只能出現一次。 - 數字
1-9
在每一列只能出現一次。 - 數字
1-9
在每一個以粗實線分隔的3x3
宮內只能出現一次。
上圖是一個部分填充的有效的數獨。
數獨部分空格內已填入了數字,空白格用 '.'
表示。
示例 1:
輸入: [ ["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"] ] 輸出: true
示例 2:
輸入: [ ["8","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"] ] 輸出: false 解釋: 除了第一行的第一個數字從 5 改為 8 以外,空格內其他數字均與 示例1 相同。 但由於位於左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。
說明:
- 一個有效的數獨(部分已被填充)不一定是可解的。
- 只需要根據以上規則,驗證已經填入的數字是否有效即可。
- 給定數獨序列只包含數字
1-9
和字元'.'
。 - 給定數獨永遠是
9x9
形式的。
解題思路(最笨):
1.先判斷所有橫排是否有重複。
2.再判斷所有豎排是否有重複。
3.依次判斷3 x 3小格子是否有重複。
public class ValidSudokuTester { public static void main(String[] args) { char[][] c = { { '.', '.', '.', '.', '5', '.', '.', '1', '.' }, { '.', '4', '.', '3', '.', '.', '.', '.', '.' }, { '.', '.', '.', '.', '.', '3', '.', '.', '1' }, { '8', '.', '.', '.', '.', '.', '.', '2', '.' }, { '.', '.', '2', '.', '7', '.', '.', '.', '.' }, { '.', '1', '5', '.', '.', '.', '.', '.', '.' }, { '.', '.', '.', '.', '.', '2', '.', '.', '.' }, { '.', '2', '.', '9', '.', '.', '.', '.', '.' }, { '.', '.', '4', '.', '.', '.', '.', '.', '.' } }; System.out.println(isValidSudoku(c)); } /** * Judge validSudoku * * @param board * @return */ public static boolean isValidSudoku(char[][] board) { // all landscape Set<Character> landscapeSet = new HashSet<Character>(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { char c = board[i][j]; if (c == '.') { continue; } if (landscapeSet.contains(c)) { return false; } landscapeSet.add(c); } landscapeSet.clear(); } // all portrait Set<Character> portraitMap = new HashSet<Character>(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { char c = board[j][i]; if (c == '.') { continue; } if (portraitMap.contains(c)) { return false; } portraitMap.add(c); } portraitMap.clear(); } // all 3*3 Set<Character> threeSet = new HashSet<Character>(); for (int k = 0; k < 3; k++) { for (int l = 0; l < 3; l++) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { int x = k * 3 + i; int y = l * 3 + j; //System.out.println("(" + x + "," + y + ")"); char c = board[x][y]; if (c == '.') { continue; } if (threeSet.contains(c)) { return false; } threeSet.add(c); } } //System.out.println("Clear"); threeSet.clear(); } } return true; } }