1,题目要求
Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:
- Each row must contain the digits 1-9 without repetition.
- Each column must contain the digits 1-9 without repetition.
- Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.
A partially filled sudoku which is valid.
The Sudoku board could be partially filled, where empty cells are filled with the character ‘.’.
Example 1:
Input:
[
["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"]
]
Output: true
Example 2:
Input:
[
["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"]
]
Output: false
Explanation: Same as Example 1, except with the 5 in the top left corner being
modified to 8. Since there are two 8’s in the top left 3x3 sub-box, it is invalid.
Note:
- A Sudoku board (partially filled) could be valid but is not necessarily solvable.
- Only the filled cells need to be validated according to the mentioned rules.
- The given board contain only digits 1-9 and the character ‘.’.
- The given board size is always 9x9.
确定9x9数独板是否有效。 只需要根据以下规则验证已填充的单元格:
- 每行必须包含数字1-9而不重复。
- 每列必须包含数字1-9而不重复。
- 网格的9个3x3子框中的每一个必须包含数字1-9而不重复。
注意:
- 数独板(部分填充)可能有效但不一定是可解决的。
- 只需要根据上述规则验证已填充的单元格。
- 给定的数独板仅包含数字1-9和字符’。’。
- 给定的数独板尺寸始终为9x9。
2,题目思路
对于这道题,要求判断一个数独板是否是有效的。
数独,也就是拉丁方或者幻方,组合数学的一个课题,在这道题中,给出的数独板是一个9*9的形式,要保证横、竖以及三乘三的子框都是1-9,没有重复的数字,数独板是有空白的,判断目前的数独板是否是可行的,即当前的数字安排是否满足上述三个条件。
明白了这三个判断条件,剩下的就比较好办了:
定义三个数组:
- int row[9][10]
- int col[9][10]
- int subBox[9][10]
分别表示行、列、子框中出现的数字的记录。
一维参数为9,因为行、列、子框都是从0到8的。
二维参数为10,因为数字是从1-9的。
其中子框:
0 1 2
3 4 5
6 7 8
因此,子框的索引:
- int subIndex = i/3*3 + j/3
上面的式子,看似是i/3*3发生了约分,最终还是i,但其实并不是这样,原因还是在于C++的除运算的特点。
3,代码实现
static auto speedup = [](){
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int row[9][10] = {0}, col[9][10] = {0}, subBox[9][10] = {0};
for(int i = 0;i<9;i++){
for(int j = 0;j<9;j++){
int n = board[i][j] == '.'? 0 : board[i][j]-'0';
if(n == 0)
continue;
if(++row[i][n] > 1)
return false;
if(++col[j][n] > 1)
return false;
int subIndex = i/3*3 + j/3;
if(++subBox[subIndex][n] > 1)
return false;
}
}
return true;
}
};