使用下划线模板构建Sudoku板

时间:2014-07-07 19:51:48

标签: javascript templates underscore.js

我正在使用下划线模板构建数独板。我在计算表格结构的数学时遇到了一些麻烦。

我的底层结构是1d数组(大小为81)。我认为解决问题的最佳方法是从3x3较小的立方体构建它。

[1,2,3,4 ....] - > [1,2,3 [1,2,3 ....                   4,5,6 4,5,6                   7,8,9] 7,8,9]

但是我无法弄清楚如何获得第一个立方体的值,然后是下一个立方体,然后是下一个立方体。

应该像

<% 
    //Defining each cube
    for (var x = 0; x < 9; x++) {
        %>
        <div class="parentCube">
        <%
        //Defining each cell in cube
        for (var y = 0; y < 9; y++) {
        console.log('x: ' + x + ' y: ' + y);
            %>
                <div class="childCube">
                    <%= 
                        //Heres where im having trouble, how do you look up the 1d array index using the outlying for loop
                        matrix.indexOf(??); 
                    %>
                </div>
            <%
        }
        %>
        </div>
        <%
    }
%>

//should follow this equation

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

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

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

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

// Or this structure of X/Y's 

X

0,1,2,0,1,2,0,1,2, 3,4,5,3,4,5,3,4,5, 6,7,8,6,7,8,6,7,8, 

0,1,2,0,1,2,0,1,2, 3,4,5,3,4,5,3,4,5, 6,7,8,6,7,8,6,7,8, 

0,1,2,0,1,2,0,1,2, 3,4,5,3,4,5,3,4,5, 6,7,8,6,7,8,6,7,8, 

    Y

0,0,0,1,1,1,2,2,2, 0,0,0,1,1,1,2,2,2, 0,0,0,1,1,1,2,2,2,

3,3,3,4,4,4,5,5,5, 3,3,3,4,4,4,5,5,5, 3,3,3,4,4,4,5,5,5,

6,6,6,7,7,7,8,8,8, 6,6,6,7,7,7,8,8,8, 6,6,6,7,7,7,8,8,8,

我已经解决了x等式,(y%3 +(x * 3))%9;我正在研究y,因为它的包装方式有点困难。

2 个答案:

答案 0 :(得分:1)

我根本不知道这对您是否有帮助,但如果您将值存储在一个平面数组中,那么您可能希望将索引集合保存到该数组中以用于行,列和小方块。这应该给你:

var _09 = [0, 1, 2, 3, 4, 5, 6, 7, 8];
var _03 = [0, 1, 2];

rows = _09.map(function(i) {return _09.map(function(j) {return 9 * i + j;});});
cols = _09.map(function(i) {return _09.map(function(j) {return i + 9 * j;});});
squares = _03.map(function(i) {return _03.map(function(j) {return 27 * i + 3 * j;});}).reduce(
    function(a, b) {return a.concat(b);}
).map(function(corner) {return _03.map(function(i) {return _03.map(
    function(j) {return corner + 9 * i + j;});}).reduce(
        function(a, b) {return a.concat(b);}
    );}
);

答案 1 :(得分:0)

我最后回答了这个问题。

<% 
    //Defining each cube
    for (var x = 0; x < 9; x++) {
        %>
        <div class="parentCube">
        <%
        //Defining each cell in cube
        for (var y = 0; y < 9; y++) {
            var row = (y%3 + (x*3)) % 9;
            var column = (Math.floor(y/3)) + (Math.floor(x/3)*3);
            console.log('[' + x + ', ' + y + ']', ' -> ' , '['  + column + ']');
            %>
                <div class="childCube">
                    <%= 
                        matrix.indexOf(row, column)
                    %>
                </div>
            <%
        }
        %>
        </div>
        <%
    }
%>