【题目】
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
注意:
一个有效的数独( 部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
空白格用 '.' 表示。
提示:
board.length == 9
board[i].length == 9
board[i][j]
是一位数字(1-9
)或者'.'
题解:
建立三个数组第一个数组row [行数] [每个数的数量] 记录每行中1-9的数量,如示例1第一行有5 3 7.则row [1][5]=1 row[1][3]=1, row[1][7]=1
同理第二个数组 cols[每个数的数量][列数]
第三个数组为三维数组num [ 3] [3 ](前两个数代表第几个3X3的九宫格)[9] (最后一个代表每个九宫格中每个数的数量) 如:示例一中第3个3X3的九宫格应该表示为num[1][3][6]=1;
在数组创建的时候将数组内所有的数初始化为0,若三个数组中任意一个大于2,则返回false;
当目标数组遍历后一遍后就返回true。
代码:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int rows[9][9];
int cols[9][9];
int sub [3][3][9];
memset(rows,0,sizeof(rows));
memset(cols,0,sizeof(cols));
memset(sub,0,sizeof(sub));
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(board[i][j]!='.')
{
int num=board[i][j]-'0'-1;
rows[i][num]++;
cols[num][j]++;
sub[i/3][j/3][num]++;
if(rows[i][num]>1||cols[num][j]>1||sub[i/3][j/3][num]>1)
return false;
}
}
}
return true;
}
};