题目:
判断一个9x9
的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用'.'
表示。
示例一:
输入:
[
["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
示例二:
输入:
[
["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
形式的。
思路:
因为有三个规则(每行,每列,每个3*3
的子数独都不能出现一样的数字),而这三个规则都可以通过顺序遍历数独中每个数而进行判断(判断完可以分别用三个数组记录下来),且这三个规则互不干涉,所以通过一次顺序遍历就可以判断整个数独是否有效。
有个小的难点是怎么记录出现在3*3
子数独中出现的数字。
肯定是要从这个表格中找到规律。
首先想到这九组3*3
的子数独可以通过遍历(1,1)(1,4)这类中心位置进行发散判断,但是每组的中心块不连续,而且规律性很差。
这时我们想到,int类型的除法结果是向下取整的,而这九个子数独的行和列都是三个一循环。然后这除出来以后的两组(0,1,2)刚好可以组合成0到8连续的九个数。
代码实现
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
//rule1[0][2]=1 第一行出现过数字3,一次。
//rule2[2][0]=0 第一列出现过数字3,零次。
//rule3[0][4]=2 第一组子数独中出现了5,两次。
int rule1[10][10]={0},rule2[10][10]={0},rule3[10][10]={0};
for(int row=0;row<9;row++)
{
for(int col=0;col<9;col++)
{
if(board[row][col]>='0'&&board[row][col]<='9')
{
rule1[row][board[row][col]-'0']++;
if(rule1[row][board[row][col]-'0']>1)
return false;
rule2[board[row][col]-'0'][col]++;
if(rule2[board[row][col]-'0'][col]>1)
return false;
int name=row/3+(col/3)*3;
rule3[name][board[row][col]-'0']++;
if(rule3[name][board[row][col]-'0']>1)
return false;
}
}
}
return true;
}
};