题目描述
Sudoku Background:
Sudoku is a game played on a 9x9 grid. The goal of the game is to fill all cells of the grid with digits from 1 to 9, so that each column, each row, and each of the nine 3x3 sub-grids (also known as blocks) contain all of the digits from 1 to 9.
我的代码
function validSolution(board){
//TODO
var flag = 1;
for(j=0; j<9; j++){
var sumcol = 0;
var sum = 0;
// 计算列和是否为45
for(i=0; i<9; i++){
sumcol += board[i][j];
}
if(sumcol != 45){
flag = 0;
break;
}
// 计算行和是否为45,利用数组的方法求和
board[j].some(function(item,i){
sum += item;
})
if(sum != 45){
flag = 0;
break;
}
}
// 计算前9个宫格的和是否为45
var sumgrid = 0;
for(k=0; k<3; k++){
for(l=0; l<3; l++){
sumgrid += board[k][l];
}
}
if(sumgrid != 45){
flag = 0;
}
if(flag){
return true;
}else{
return false;
}
}
Clever
function equals45(n){
return n == 45;
}
function validSolution(board){
var sumh = [0,0,0,0,0,0,0,0,0];
var sumv = [0,0,0,0,0,0,0,0,0];
osums = [[0,0,0],[0,0,0],[0,0,0]];
for (var i=0;i<9;i++){
for (var j=0;j<9;j++){
sumh[i] += board[i][j];
sumv[j] += board[i][j]; // 这里我认为应该是board[j][i]
osums[Math.floor(i/3)][Math.floor(j/3)] += board[i][j];
}
}
for (var i=0;i<3;i++)
if (!osums[i].every(equals45))
return false;
return (sumh.every(equals45) && sumv.every(equals45)); }
Key
every()
方法只有数组中每一项执行回调函数结果合部为true才会返回,不然就会返回false。
-这个题的做法实质上是不能正确验证是否是数独解。因为若每个cell都是5,满足行、列、每个9宫格的和为45的条件,但不满足数独解的条件。