2017-03-24 51 views
0

我試圖將一個數獨網格分組到9個框中。我排列了列和行,但不能想到一個有效的方法來編碼盒數組。 我看僞是這樣的:如何將此psudocode塊優化爲循環?

 add rowArray0 entries 0,1,2 to boxArray0 
     add rowArray1 entries 0,1,2 to boxArray0 
     add rowArray2 entries 0,1,2 to boxArray0 

     add rowArray0 entries 3,4,5 to boxArray1 
     add rowArray1 entries 3,4,5 to boxArray1 
     add rowArray2 entries 3,4,5 to boxArray1 

     add rowArray0 entries 6,7,8 to boxArray2 
     add rowArray1 entries 6,7,8 to boxArray2 
     add rowArray2 entries 6,7,8 to boxArray2 

     add rowArray3 entries 0,1,2 to boxArray3 
     add rowArray4 entries 0,1,2 to boxArray3 
     add rowArray5 entries 0,1,2 to boxArray3 

     add rowArray3 entries 3,4,5 to boxArray4 
     add rowArray4 entries 3,4,5 to boxArray4 
     add rowArray5 entries 3,4,5 to boxArray4 

     add rowArray3 entries 6,7,8 to boxArray5 
     add rowArray4 entries 6,7,8 to boxArray5 
     add rowArray5 entries 6,7,8 to boxArray5 

     add rowArray6 entries 0,1,2 to boxArray6 
     add rowArray7 entries 0,1,2 to boxArray6 
     add rowArray8 entries 0,1,2 to boxArray6 

     add rowArray6 entries 3,4,5 to boxArray7 
     add rowArray7 entries 3,4,5 to boxArray7 
     add rowArray8 entries 3,4,5 to boxArray7 

     add rowArray6 entries 6,7,8 to boxArray8 
     add rowArray7 entries 6,7,8 to boxArray8 
     add rowArray8 entries 6,7,8 to boxArray8 

我很抱歉,如果這似乎是一個愚蠢的問題,我只是沒有足夠的智慧人物的迴路等效。 有人聰明可以告訴我一個解決方案?

編輯添加的行和列陣列結構:

<table> 
<tr class="r0"> 
<td contenteditable="true" class="c0" onkeyup="inputFilter(this)">1</td> 
<td contenteditable="true" class="c1" onkeyup="inputFilter(this)">2</td> 
<td contenteditable="true" class="c2" onkeyup="inputFilter(this)">3</td> 
<td contenteditable="true" class="c3" onkeyup="inputFilter(this)">4</td> 
<td contenteditable="true" class="c4" onkeyup="inputFilter(this)">5</td> 
<td contenteditable="true" class="c5" onkeyup="inputFilter(this)">6</td> 
<td contenteditable="true" class="c6" onkeyup="inputFilter(this)">7</td> 
<td contenteditable="true" class="c7" onkeyup="inputFilter(this)">8</td> 
<td contenteditable="true" class="c8" onkeyup="inputFilter(this)">9</td> 
</tr> 
<tr class="r1"> 
etc 

<script> 
     //columns 
     for(i=0;i<9;i++){ 
      str = "c" + i; 
      allCols[i] = document.getElementsByClassName(str); 
     } 

     //rows 
     for(i=0;i<9;i++){ 
      rowArray = new Array(); 
      for(ii=0;ii<9;ii++){ 
       colArray = allCols[ii]; 
       elem = colArray[i]; 
       rowArray[ii] = elem; 
      } 
      allRows[i] = rowArray; 
     } 

那麼的cols是從上到下,從左到右。 行從左到右,從上到下。 關於多數組的必要性的評論 - 這不是引用每個結構的最佳方式嗎?我想我可以每次使用數學來定位html元素,但是在初始化時將它們分組到數組似乎是合乎邏輯的......也許我錯了? 我想這是對getElementsByClassName如何分組到一個數組的反應。爲什麼我可以將它們解壓縮成單維數組?

+4

這是怎麼涉及到的JavaScript? –

+0

您可以發佈您的rowArrays結構和boxArrays所需的輸出請 –

+0

您是否想出一個有效的數據結構來表示您的Sudoku網格?如果是這種情況,請從實施中退出一秒,並考慮您需要訪問/更改字段的方式。你真的需要多個數組嗎? – Timo

回答

0

將底層數據模型與其表示清晰分離總是有用的。

  • 數獨可以被認爲是9×9數字的矩陣。矩陣可以表示爲9 x 9元素的平面數組,通過將其列或行連接成長的一維序列。如果你打算實現一個數獨生成器或求解器,你可能想要選擇一個兼容線性代數庫的格式。

  • 數獨的可視化表示通常包括在9 x 9表格中排列成3 x 3塊的數字。

一個簡單的非交互式例如:

function getNumberAt(numbers, x, y) { 
 
    return numbers[x + 9 * y]; 
 
} 
 

 
function setNumberAt(numbers, x, y, value) { 
 
    return numbers[x + 9 * y] = value; 
 
} 
 

 
function render(numbers, table) { 
 
    let tbody = document.createElement('tbody'); 
 
    for (let x = 0; x < 9; ++x) { 
 
    let tr = document.createElement('tr'); 
 
    for (var y = 0; y < 9; ++y) { 
 
     let td = document.createElement('td'); 
 
     td.textContent = getNumberAt(numbers, x, y); 
 
     tr.appendChild(td); 
 
    } 
 
    tbody.appendChild(tr); 
 
    } 
 
    table.appendChild(tbody); 
 
} 
 

 
// Example: 
 
const numbers = new Array(9 * 9); 
 
setNumberAt(numbers, 0, 0, 1); 
 
setNumberAt(numbers, 0, 1, 2); 
 
setNumberAt(numbers, 1, 0, 3); 
 
setNumberAt(numbers, 8, 8, 9); 
 
render(numbers, document.getElementById('sudoku'));
#sudoku td { 
 
    border: thin black solid; 
 
    width: 1em; 
 
    height: 1em; 
 
} 
 

 
#sudoku td:nth-child(3n) { 
 
    border-right: thick black solid; 
 
} 
 

 
#sudoku tr:nth-child(3n) td { 
 
    border-bottom: thick black solid; 
 
}
<table id="sudoku"></table>

+0

這是一個很好的答案謝謝! 所以numbers []是一個包含81個條目的數組,您可以使用x和y值進行引用? 我不確定您使用「=>」,對不起。 – user3672543

+0

@ user3672543'f = x => y'箭頭語法允許定義與函數f(x)非常相似的函數{return y; }'。我改變了標準函數聲明的答案以便於閱讀。數字[]數組包含81個條目。條目0-8是第一行,條目9-17是第二行,18-26是第三行,依此類推。給定x和y,可以通過計算x + y * 9來在平面數組中找到相應的元素。 –