题解 | #暮光数独验证#
暮光数独验证
https://www.nowcoder.com/practice/68dd2d15263f433db6ffa0405d08426a
考察的知识点:哈希;
解答方法分析:
- 遍历每一行,使用一个布尔数组filled来记录当前行中出现的数字。如果当前位置的数字不是空格,并且不是1-9的数字,或者已经在该行中出现过,都返回false。如果该数字是合法的,将其在filled数组中对应的位置标记为已填充。
- 遍历每一列,使用类似的方法检查每一列是否合法。
- 遍历每一个小九宫格,使用类似的方法检查每一个小九宫格是否合法。
- 如果在遍历过程中发现任何不合法的情况,立即返回false。如果所有的遍历都通过了,返回true,表示数独是合法的。
所用编程语言:C++;
完整编程代码:↓
class Solution { public: bool isValidTwilightSudoku(vector<vector<char> >& board) { for (int i = 0; i < 9; i++) { vector <bool> filled(9, false); for (int j = 0; j < 9; j++) { if (board[i][j] != '.') { if (!isdigit(board[i][j]) || filled[board[i][j] - '1']) { return false; } filled[board[i][j] - '1'] = true; } } } for (int j = 0; j < 9; j++) { vector<bool> filled(9, false); for (int i = 0; i < 9; i++) { if (board[i][j] != '.') { if (!isdigit(board[i][j]) || filled[board[i][j] - '1']) { return false; } filled[board[i][j] - '1'] = true; } } } for (int k = 0; k < 9; k++) { int startRow = (k / 3) * 3; int startCol = (k % 3) * 3; vector<bool> filled(9, false); for (int i = startRow; i < startRow + 3; i++) { for (int j = startCol; j < startCol + 3; j++) { if (board[i][j] != '.') { if (!isdigit(board[i][j]) || filled[board[i][j] - '1']) { return false; } filled[board[i][j] - '1'] = true; } } } } return true; } };