Medium!
題目描述:
判斷一個 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
形式的。
解題思路:
這道題讓我們驗證一個方陣是否為數獨矩陣。判斷標准是看各行各列是否有重復數字,以及每個小的3x3的小方陣里面是否有重復數字,如果都無重復,則當前矩陣是數獨矩陣,但不代表該數獨矩陣有解,只是單純的判斷當前未填完的矩陣是否是數獨矩陣。
根據數獨矩陣的定義,在遍歷每個數字的時候,就看看包含當前位置的行和列以及3x3小方陣中是否已經出現該數字,那么我們需要三個標志矩陣,分別記錄各行,各列,各小方陣是否出現某個數字,其中行和列標志下標很好對應,就是小方陣的下標需要稍稍轉換一下。
C++解法一:
1 class Solution { 2 public: 3 bool isValidSudoku(vector<vector<char> > &board) { 4 if (board.empty() || board[0].empty()) return false; 5 int m = board.size(), n = board[0].size(); 6 vector<vector<bool> > rowFlag(m, vector<bool>(n, false)); 7 vector<vector<bool> > colFlag(m, vector<bool>(n, false)); 8 vector<vector<bool> > cellFlag(m, vector<bool>(n, false)); 9 for (int i = 0; i < m; ++i) { 10 for (int j = 0; j < n; ++j) { 11 if (board[i][j] >= '1' && board[i][j] <= '9') { 12 int c = board[i][j] - '1'; 13 if (rowFlag[i][c] || colFlag[c][j] || cellFlag[3 * (i / 3) + j / 3][c]) return false; 14 rowFlag[i][c] = true; 15 colFlag[c][j] = true; 16 cellFlag[3 * (i / 3) + j / 3][c] = true; 17 } 18 } 19 } 20 return true; 21 } 22 };