有效的数独
判断一个 9x9 的数独是否有效。只须要根据如下规则,验证已经填入的数字是否有效便可。code
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每个以粗实线分隔的 3x3 宫内只能出现一次。ip
上图是一个部分填充的有效的数独。leetcode
数独部分空格内已填入了数字,空白格用 '.' 表示。get
示例 1:io
输入:console
[ ["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"] ]
输出:function
true
示例 2:循环
输入:top
[ ["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"] ]
输出:view
false
解释: 除了第一行的第一个数字从 5 改成 8 之外,空格内其余数字均与 示例1 相同。
但因为位于左上角的 3x3 宫内有两个 8 存在, 所以这个数独是无效的。
说明:
一个有效的数独(部分已被填充)不必定是可解的。 只须要根据以上规则,验证已经填入的数字是否有效便可。 给定数独序列只包含数字 1-9 和字符 '.' 。 给定数独永远是 9x9 形式的。
分三步判断该数独是否有效:
1.每行是否有效:双重循环
2.每列是否有效:双重循环
3.每一个3*3小格是否有效:四重循环.一共九个小格子,每一个格子的顶点元素下标分别为:
(0,0)(0,3)(0,6)(3,0)(3,3)(3,6)(6,0)(6,3)(6,6)
用num[i]记录数字i是否使用过,num[i]标识数字i使用过,若是重复使用,则返回false.
注意下标和(数字-1)的对应,每次用完要把num清空。
/** * @param {character[][]} board * @return {boolean} */ var isValidSudoku = function(board) { let num1 = []; let num2 = []; let num3 = []; for(let i = 0; i < 9; i++){ for(let posn = 0; posn < 9; posn++){ num1[posn] = false; num2[posn] = false; } for(let j = 0; j < 9; j++){ if(board[i][j] != '.'){ let n = parseInt(board[i][j]); if(!num1[n-1]){ num1[n-1] = true; }else{ return false; } } if(board[j][i] != '.'){ let n = parseInt(board[j][i]); if(!num2[n-1]){ num2[n-1] = true; }else{ return false; } } } } for(let i = 0; i <= 6; i+=3){ for(let j = 0; j <= 6; j+=3){ //console.log(i,j); for(let posn = 0; posn < 9; posn++){ num3[posn] = false; } //console.log(num3); for(let s1 = i; s1 < i+3; s1++){ for(let s2 = j; s2 < j+3; s2++){ if(board[s1][s2] != '.'){ let n = parseInt(board[s1][s2]); //console.log(n,num3[n]); if(!num3[n-1]){ num3[n-1] = true; }else{ return false; } } } } } } return true; };