在交替的方格中填充二维数组

4
您有一个值n,它将确定一个二维数组或表的维数。然后您应该从外层到中心分别填充数组或表,一次用1和一次用0,直到没有其他元素可写为止。
例如:当n等于5时,数组如下所示: n=5 当n等于6时,数组如下所示: n=6 我已经尝试了很长时间,但只能填充边界,希望得到任何帮助。这是我的最新代码:
function fillArray(n) {
    var exArray = [];
    var html = '';
    for (var i = 0; i < n; i++) {
        html+= '<tr>';
        exArray[i] = [];
        for (var j = 0; j < n; j++) {
            exArray[i][j] = 0;
            if(i%(n-1)==0 || j%(n-1)==0) {
                exArray[i][j] = 1;
            }
            html+='<td class="text-center">'+exArray[i][j]+' ['+i+','+j+']</td>';
        };
        html+= '</tr>';
    };
    return html;
}

5
请发布一些不起作用的代码。 - Ejaz
看起来运行良好 http://jsfiddle.net/h6e9w1fx/ ... 否则需要更多明确的预期结果解释。 - charlietfl
如表格所示,它需要不断填充交替的正方形,直到达到中心。 - Jinendra Khobare
只有在奇数的 n 上才能完美运行...那么在偶数的 n 上应该做什么呢? - charlietfl
您可以在参考图中看到。n=6,中心4个单元格获得1。每个交替的正方形都应填充为1,直到达到中心。 - Jinendra Khobare
我觉得我接近了...再给我几分钟。 - Dominic Sore
3个回答

5

我认为最简单的方法是只考虑左上象限,然后通过对称填充其他部分:

var arr = Array(n);
for(var i=0; i<n/2; ++i) {
    arr[  i  ] = new Array(n);
    arr[n-1-i] = new Array(n);
    for(var j=0; j<n/2; ++j)
        arr[  i  ][j] = arr[  i  ][n-1-j] =
        arr[n-1-i][j] = arr[n-1-i][n-1-j] =
        + !(Math.min(i,j) % 2);
}

function fillArray(n) {
  var arr = Array(n);
  for(var i=0; i<n/2; ++i) {
    arr[  i  ] = new Array(n);
    arr[n-1-i] = new Array(n);
    for(var j=0; j<n/2; ++j)
      arr[  i  ][j] = arr[  i  ][n-1-j] =
      arr[n-1-i][j] = arr[n-1-i][n-1-j] =
      + !(Math.min(i,j) % 2);
  }
  var table = document.createElement('table');
  for(var i=0; i<n; ++i) {
    var row = table.insertRow();
    for(var j=0; j<n; ++j)
      row.insertCell().textContent = arr[i][j];
  }
  return table;
}
document.body.appendChild(fillArray(9));
td {
  width: .8em;
  height: .8em;
  line-height: .8em;
}


0

虽然不够简洁,但是可以工作:

var n = 10;

function isMiddleIndex(middleIdx, rowIndex, cellIndex) {
    return middleIdx.indexOf(rowIndex) != -1 && middleIdx.indexOf(cellIndex) != -1;
}

function isBoundaryIndex(n, boundsIdx, i, j) {
    return boundsIdx.indexOf(i) > -1 || boundsIdx.indexOf(j) > -1;
}

function fillArray(n) {
    var num,
        html = '',
        nMid = n / 2,
        middleIdx = n % 2 == 1 ? [(n - 1) / 2] : [Math.floor(nMid) - 1, Math.ceil(nMid)],
        boundsIdx = [0, n - 1];
    for (var i = 0; i < n; i++) {
        html += '<tr>';
        for (var j = 0; j < n; j++) {
            num = isMiddleIndex(middleIdx, i, j) || isBoundaryIndex(n, boundsIdx, i, j) ? 1 : 0;
            html += '<td class="text-center">' + num + '</td>';
        };
        html += '</tr>';
    };
    return html;
}

$('table').html(fillArray(n));

演示


我认为我在更大的表上误解了预期结果...只有外部和内部得到了零。 - charlietfl

0

一种更易读的方式

    function fillArray(n) {
    var exArray = [];
    for (var i = 0; i < n; i++) {
        exArray[i] = [];
        for (var j = 0; j < n; j++) {
            exArray[i][j] = 0;
            if(i < j) {
                if(n - j - 1 > i) {
                    if(i % 2 == 0) {
                        exArray[i][j] = 1;
                    }
                }
                else {
                    if((n - j - 1) % 2 == 0) {
                        exArray[i][j] = 1;
                    }
                }
            }
            else {
                if(j > n - i - 1) {
                    if((n - i - 1) % 2 == 0) {
                        exArray[i][j] = 1;
                    }
                }
                else {
                    if(j % 2 == 0) {
                        exArray[i][j] = 1;
                    }
                }
            }
        };
    };
}

还有Fiddle


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接