数独判定规则:
# 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
# 数字 1-9 在每一行只能出现一次。
# 数字 1-9 在每一列只能出现一次。
# 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
实现思路:
1.判定每个数组是否存在重复数据
2.行和列反转,组合成新的数组,然后再判定每个数组是否存在重复数据
3.调整每个单元格组合为新的数组,然后再次判定每个数组是否存在重复数据
下面是全部代码,可以直接在浏览器运行,然后打开控制台,修改数独数据,进行查看判定结果
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
/*# 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
# 数字 1-9 在每一行只能出现一次。
# 数字 1-9 在每一列只能出现一次。
# 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
*/
var series = [
["8","3",".",".","5",".",".",".","."],
["6",".",".","1","9","2",".",".","."],
[".","9","1",".",".",".",".","6","."],
["1",".","5",".","6",".",".",".","3"],
["4",".",".","8",".",".",".",".","1"],
["3",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","3",".",".","."],
[".",".",".",".","8",".",".","7","9"]
]
var Sudoku = function(data){
var line = lineRepeat(data)
if(line){
console.log('第'+line+'行有重复')
return false
}
var column = reversalArr(data)
if(column){
console.log('第'+column+'列有重复')
return false
}
var unit = unitArr(data)
if(unit){
console.log('第'+unit+'单元有重复')
return false
}
console.log('无重复数据')
}
//单元变数组
unitArr = function(data){
var newArrs = []
for(var j=0,len2=data.length;j<3;j++){
for(var k=0;k<3;k++){
var newArr = []
for(var i=0,len=data.length;i<3;i++){
newArr = newArr.concat(data[k*3+i].slice(j*3,j*3+3))
}
newArrs.push(newArr)
}
}
return lineRepeat(newArrs)
}
//反转,行变列
reversalArr = function(data){
var newArrs = []
for(var j=0,len2=data[0].length;j<len2;j++){
var newArr = []
for(var i=0,len=data.length;i<len;i++){
newArr.push(data[i][j])
}
newArrs.push(newArr)
}
return lineRepeat(newArrs)
}
//判定行内是否存在重复,若存在 返回该行下标
lineRepeat = function(data){
for(var i=0,len=data.length;i<len;i++){
if(unique(data[i])){
return ++i
}
}
return false
}
//数组去重
var unique = function(arr){
var array = []
for(var i=0;i<arr.length;i++){
if(arr[i] !== '.'){
if(array.indexOf(arr[i])===-1){
array.push(arr[i])
}else{
//存在重复数据
return true
}
}
}
//不存在重复数据
return false
}
//调用方法
Sudoku(series)
</script>
</body>
</html>
目前只是判定功能实现了,还没有进行优化,欢迎小伙伴提出优化意见!
如有疑问,请留言!