2017-03-24 1 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

방법이 자바 스크립트 관련이? –

+0

rowArrays의 구조와 boxArrays에서 원하는 출력을 게시 할 수 있습니다 –

+0

효율적인 데이터 구조를 사용하여 스도쿠 격자를 나타낼려고하십니까? 그렇다면 구현을 잠시 중단하고 필드에 액세스하고 변경해야하는 방법을 생각하십시오. 여러 개의 배열이 정말로 필요합니까? – Timo

답변

0

기본 데이터 모델과 표현의 명확한 구분은 항상 유용합니다.

  • 스도쿠는 9 x 9 숫자의 행렬로 생각할 수 있습니다. 행렬은 열 또는 행을 긴 1 차원 시퀀스로 연결하여 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 []는 x 및 y 값으로 참조하는 81 개의 항목이있는 배열입니까? "=>"을 (를) 사용 하신지 잘 모르겠습니다. 죄송합니다. – user3672543

+0

@ user3672543'f = x => y' 화살표 문법은'function f (x) {return y; }'. 가독성을 높이기 위해 표준 함수 선언에 대한 대답을 변경했습니다. numbers [] 배열에는 81 개의 항목이 들어 있습니다. 엔트리 0-8은 첫 번째 행, 엔트리 9-17은 두 번째 행, 18-26은 세 번째 행 등입니다. x와 y가 주어지면 x + y * 9를 계산하여 평면 배열에서 해당 요소를 찾을 수 있습니다. –

관련 문제