对角移动2D阵列(矩阵)

jon*_*br1 4 javascript matrix multidimensional-array

所以我发现这个线程在对角遍历数组时非常有用.我被困在镜像上了.例如:

var m = 3;
var n = 4;
var a = new Array();
var b = 0;

for(var i = 0; i < m; i++) {
  a[i] = new Array(n);
  for(var j = 0; j < n; j++) {
    a[i][j] = b;
      b++;
  }
}

for (var i = 0; i < m + n - 1; i++) {
  var z1 = (i < n) ? 0 : i - n + 1;
  var z2 = (i < m) ? 0 : i - m + 1;
  for (var j = i - z2; j >= z1; j--) {
    console.log(a[j][i - j]);
  }
}
Run Code Online (Sandbox Code Playgroud)

控制台读取 [[0],[4,1],[8,5,2],[9,6,3],[10,7],[11]]

我想读它 [[8],[4,9],[0,5,10],[1,6,11],[2,7],[3]]

被困了一会儿,就像一个魔方> _ <

Alc*_*nja 9

好吧,我发现整个z1,z2逻辑有点不可读,所以我做的有点不同:

var m = 3;
var n = 4;
var a = new Array();
var b = 0;

for(var i = 0; i < m; i++) {
  a[i] = new Array(n);
  for(var j = 0; j < n; j++) {
    a[i][j] = b;
      b++;
  }
}

var out = new Array();
for (var i = 1 - m; i < n; i++) {
    var group = new Array();
    for (var j = 0; j < m; j++) {
        if ((i + j) >= 0 && (i + j) < n) {
            group.push(a[j][i + j]);
        }
    }
    out.push(group);
}
console.log(out);
Run Code Online (Sandbox Code Playgroud)

打印[[8], [4, 9], [0, 5, 10], [1, 6, 11], [2, 7], [3]]到控制台.

这个怎么运作

你的矩阵结构给你一个像这样的矩形(你的a数组是行集):

 0  1  2  3
 4  5  6  7
 8  9 10 11

这意味着对角线位于此网格上方:

 #  #  0  1  2  3
    #  4  5  6  7  #
       8  9 10 11  #  #

现在我们只是循环一个倾斜的矩形,看起来像这样规范化了:

 #  #  0  1  2  3
 #  4  5  6  7  #
 8  9 10 11  #  #

现在您将注意到,对于您添加的每一行,最终会得到一个额外的列(以a开头#),并且第一列现在倾斜了这个量(如果您想要将第一行放在适当的位置并滑动下面的行)向左转).因此,对于我们的外部for循环(在列上),第一列实际上是旧的第一列0,减去行数m,加上1,给出0 - m + 11 - m.最后一列有效地保留在原地,所以我们仍然在循环n.然后它只需要每个列并循环每一m行(内部for循环).

当然,这会给你留下一堆undefineds(#上面网格中的s),但是我们可以用一个简单的方法跳过它们,if以确保我们的i&jm&nbounds内.

可能效率略低于z1/ z1版本,因为我们现在循环遍历冗余#单元而不是预先计算它们,但它不应该产生任何真正的世界差异并且我认为代码最终会更具可读性.