Js數(shù)獨驗證
image.png
在網(wǎng)上看到一道數(shù)獨驗證的題鸠真。
數(shù)獨游戲是在一個9*9的方格中進(jìn)行填數(shù)字的游戲,需要滿足的規(guī)則是每行每列和每個子九宮格都是1~9的不重復(fù)數(shù)字
需要完成的:給定一個九項的二維數(shù)組,用代碼確認(rèn)九宮格的填寫是否符合數(shù)獨規(guī)則;
例如:
var board = [
[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(board);
=>true
我的想法是,既然每行每列每個子九宮格都是1~9的不重復(fù)數(shù)字涨享,也就是說只要判斷這三個條件滿足和為45就好了苦银;
var equals = function(number){
return n==45;
}//判斷結(jié)果是否為45
很明顯 board有9行9列 判斷9行需要一次遍歷 判斷9列又需要一次,看起來有點麻煩春弥。
我們可以把行的和列的相加結(jié)果放在數(shù)組里寓免,最后遍歷兩個數(shù)組來進(jìn)行判斷。
var validSolution = function(board){
var rows = [0,0,0,0,0,0,0,0,0];
var columns = [0,0,0,0,0,0,0,0,0];
for(var i=0;i<9;i++){
//i表示行 j表示列
for(var j=0;j<9;j++){
rows[i]+=board[i][j];
columns[j]+=board[i][j];
}
}
}
很簡單的 rows和columns里就有了前兩個條件的數(shù)據(jù),接下來是第三個條件
每個九宮格的和都是45
找一下子格在二維數(shù)組的規(guī)律
- 01 02 03
- 11 12 13
- 21 22 23
沒找到,再來一個
- 04 05 06
- 14 15 16
- 24 25 26
可以看出盹沈,小格是以三行或者三列為一個單位的龄章,小格的相加數(shù)可以組成一個二維數(shù)組
[[0,0,0],[0,0,0],[0,0,0]]
于是,第三個條件也可以做了
var osums = [[0,0,0],[0,0,0],[0,0,0]];
for(var i=0;i<9;i++){
for(var j=0;j<9;j++){
osums[Math.floor(i/3)][Math.floor(j/3)] += board[i][j];
}
}
與上面的整合起來就是
var equals = function(number){
return number==45;
}//判斷結(jié)果是否為45
var validSolution = function(board){
var rows = [0,0,0,0,0,0,0,0,0];
var columns = [0,0,0,0,0,0,0,0,0];
var osums = [[0,0,0],[0,0,0],[0,0,0]];
for(var i=0;i<9;i++){
//i表示行 j表示列
for(var j=0;j<9;j++){
rows[i]+=board[i][j];
columns[j]+=board[i][j];
osums[Math.floor(i/3)][Math.floor(j/3)] += board[i][j];
}
}
for (var i=0;i<3;i++) if (!osums[i].every(equals)) return false;
return (rows.every(equals) && columns.every(equals));
}
這樣的結(jié)果是可以通過我們上面例子的驗證的 但是...(下回更)