题目来源: http://www.codewars.com/kata/sudoku-solution-validator
你怎么不知道数独?快去看看 百度百科 ,顺便搜索一款在线游戏杀两盘。
本文不会教你如何成为数独高手,而是探讨一下如何校验数独的正确性,也就是 满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复 ,然后用 js
来实现它。
为了能让 js
也认识数独,我们将其抽象为一个二维数组:
var sudoku = [[5, 3, 4, 6, 7, 8, 9, 1, 2], [6, 7, 2, 1, 9, 5, 3, 4, 8], [1, 9, 8, 3, 4, 2, 5, 6, 7], [8, 5, 9, 7, 6, 1, 4, 2, 3], [4, 2, 6, 8, 5, 3, 7, 9, 1], [7, 1, 3, 9, 2, 4, 8, 5, 6], [9, 6, 1, 5, 3, 7, 2, 8, 4], [2, 8, 7, 4, 1, 9, 6, 3, 5], [3, 4, 5, 2, 8, 6, 1, 7, 9]]
然后去实现一个 validSolution(sudoku)
函数,来返回 true
| false
.
参考来源
首先呢,我们将每一行,每一列,每一个粗线宫的数字取出来,放到相应数组内:
function validSolution(board){ var arrh = [[],[],[],[],[],[],[],[],[]]; var arrv = [[],[],[],[],[],[],[],[],[]]; var arrb = [[[],[],[]],[[],[],[]],[[],[],[]]]; for (var i=0;i<9;i++){ for (var j=0;j<9;j++){ arrh[i].push(board[i][j]); arrv[j].push(board[i][j]); arrb[Math.floor(i/3)][Math.floor(j/3)].push(board[i][j]); } } }
然后,doSomething,就是判断是否包含 1-9 咯,如何做呢?
1,2,3,4,5,6,7,8,9
arr.sort()
123456789
对比 arr.join()
function validArr(arr){ return arr.sort(function(a,b){return a-b}).join("") === "123456789" }
参考来源
但是,这样并不严密,所有数字都填 5 的话,也就通过了。
参考来源
arr.indexOf()
function validRange(arr) { for (var i=0; i<arr.length; i++) { if (arr[i] < 1 || arr[i] > 9 || arr.indexOf(arr[i]) !== i) return false } return true; }
参考来源
function check(numbers){ return numbers.slice(0).sort().every(function(e, i){return e==i+1;}); }
参考来源
delete
如果你是大神,或有更好的方案,欢迎在下方留言。