2016-10-16 72 views
0

我建立了一個創建多維數組的數獨網格。 我嘗試實施的一個邏輯是檢查九個中心周圍的數字。如何在多維數組中動態修改我的選擇?

var grid = [ 

    [1,4,2,8,0,6,7,9,5], 
    [8,0,0,0,9,1,0,7,1], 
    [4,9,0,2,5,2,0,0,0], 
    [9,0,2,9,1,2,0,0,0], 
    [0,5,8,8,5,3,9,0,0], 
    [3,1,0,7,6,4,0,2,0], 
    [2,3,0,1,5,8,7,9,4], 
    [7,8,0,0,7,5,4,0,0], 
    [6,0,7,4,3,7,0,0,9], 

];

我從我的數獨網格中心有以下幾種:

var gridCenters = [grid[1][1],grid[1][4],grid[1][7],grid[4][1],grid[4][4],grid[4][7],grid[7][1],grid[7][4],grid[7][7]]; 

並圍繞每個中心的9號(包括中心)如下:

var nineFromSquare = [grid[i][j],grid[i-1][j-1],grid[i-1][j],grid[i][j-1],grid[i+1][j+1],grid[i+1][j],grid[i+1][j],grid[i-1][j+1],grid[i+1][j-1]]; 

Sudoku grid

我嘗試創建一個for循環,它接受每個gridCenter並將其應用於其索引以獲得一定的值,以添加用於數獨求解的額外邏輯。基本上,我想檢查中心周圍的數字是數字還是空的。

任何提示?謝謝!

+0

您的'gridCenters'不應該包含'grid [1] [1]'? – Redu

+0

你是對的減少,只是糾正。 – Genia

回答

0

如果電路板上的0指定爲空,則可能會執行以下操作;

function getBorder(center){ 
 
    var offsets = [[-1,-1],[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,1],[-1,0]]; 
 
    return offsets.map(c => [c[0] + center[0], c[1] + center[1]]); 
 
} 
 

 
function getNestedValue(o,...a){ 
 
    var val = o; 
 
    for (var prop of a) val = typeof val === "object" && 
 
            val !== null  && 
 
            val[prop] !== void 0 ? val[prop] 
 
                 : undefined; 
 
    return val; 
 
} 
 

 
var grid = [[1,4,2,8,0,6,7,9,5], 
 
      [8,0,0,0,9,1,0,7,1], 
 
      [4,9,0,2,5,2,0,0,0], 
 
      [9,0,2,9,1,2,0,0,0], 
 
      [0,5,8,8,5,3,9,0,0], 
 
      [3,1,0,7,6,4,0,2,0], 
 
      [2,3,0,1,5,8,7,9,4], 
 
      [7,8,0,0,7,5,4,0,0], 
 
      [6,0,7,4,3,7,0,0,9], 
 
      ], 
 
centers = [[1,1],[1,4],[1,7],[4,1],[4,4],[4,7],[7,1],[7,4],[7,7]]; 
 
    result = centers.map(c => getBorder(c).every(b => getNestedValue(grid,...b))); 
 
console.log(result);

getBorder()函數返回我們8個項目被周圍由函數的一個參數所具有的中心項目。 getNestedValue()函數將以正確的順序動態返回對象/數組的無限嵌套屬性項。在這種情況下[x,y]

如果您不需要爲每個中心,但一個對所有的結果,那麼你可能轉換

result = centers.map(c => getBorder(c).every(b => getNestedValue(grid,...b))); 

成;

result = centers.every(c => getBorder(c).every(b => getNestedValue(grid,...b)));