题目如下:
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 题目链接
示例 1:
输入:
[
["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
示例 2:
输入:
[
["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
说明:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
给定数独序列只包含数字 1-9 和字符 ‘.’ 。
给定数独永远是 9x9 形式的。
解题思路:
要判断给出的题目是否是一个有效数独分为三步,一是判断每一行是否有重复的元素,二是判断每一列是否有重复的元素,三是判断每一个小块是否有重复的元素,这里可以把每一小块的有效元素分别保存到一个数组中,再判断这个新数组是否有重复的元素
var isValidSudoku = function(board) {
var flag=0;
for(var i=0;i<9;i++){
for(var j=0;j<9;j++){
for(var z=j+1;z<9;z++){
if(board[i][j]!="."&&board[i][j]===board[i][z]){ //判断行是否满足规则
flag=1;
return false;
}
if(board[j][i]!="."&&board[j][i]===board[z][i]){ //判断列是否满足规则
flag=1;
return false;
}
}
}
}
for(var row=0;row<9;row+=3){
for(var col=0;col<9;col+=3){
var nums=[];
for(a=row;a<row+3;a++){
for(b=col;b<col+3;b++){
if(board[a][b]!="."){
nums.push(board[a][b]); //将小方格中有效数据放入一个数组
}
}
}
for(var x=0;x<nums.length;x++){ //判断小方格是否满足规则
for(var y=x+1;y<nums.length;y++){
if(nums[x]===nums[y]){
flag=1;
return false;
}
}
}
}
}
if(flag===0){
return true; //全部符合规则,输出正确
}
};