简体   繁体   English

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

[英]Traverse 2D Array (Matrix) Diagonally

So I found this thread that was extremely helpful in traversing an array diagonally. 所以我发现这个线程在对角遍历数组时非常有用。 I'm stuck though on mirroring it. 我被困在镜像上了。 For example: 例如:

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]);
  }
}

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

I'd like it to read [[8],[4,9],[0,5,10],[1,6,11],[2,7],[3]] 我想阅读[[8],[4,9],[0,5,10],[1,6,11],[2,7],[3]]

Been stumped for awhile, it's like a rubik's cube >_< 被困了一会儿,就像一个魔方> _ <

Well, I found the whole z1, z2 logic a bit unreadable, so I did it a bit differently: 好吧,我发现整个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);

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

How it works 这个怎么运作

Your matrix construction gives you a rectangle like this (where your a array is the set of rows): 你的矩阵结构给你一个像这样的矩形(你a数组是行集):

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

Which means the diagonals are over this grid: 这意味着对角线位于此网格上方:

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

Now we're just looping over a skewed rectangle, that would look like this normalised: 现在我们只是循环一个倾斜的矩形,看起来像这样规范化了:

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

Now you'll notice that for each row you add, you end up with an extra column (starting with a # ) and that the first column is now skewed by this amount (if you imagine holding the first row in place & sliding the rows below to the left). 现在您将注意到,对于您添加的每一行,您最终会得到一个额外的列(以#开头),并且第一列现在倾斜了这个量(如果您想要保持第一行并滑动行在左下方)。 So for our outer for loop (over the columns), the first column is effectively the old first column, 0 , minus the number of rows m , plus 1 , which gives 0 - m + 1 or 1 - m . 因此,对于我们的外部for循环(在列上),第一列实际上是旧的第一列, 0 ,减去行数m1 ,得到0 - m + 11 - m The last column effectively stays in place, so we're still looping to n . 最后一列有效地保留在原位,所以我们仍然循环到n Then its just a matter of taking each column & looping over each of the m rows (inner for loop). 然后它只是服用每一列&遍历每个事项m行(内for循环)。

Of course this leaves you with a bunch of undefined s (the # s in the grid above), but we can skip over them with a simple if to make sure our i & j are within the m & n bounds. 当然,这给你留下一堆的undefined秒( #以上电网或多个),但我们可以跳过它们用一个简单的if要确保我们的ij是内mn界限。

Probably slightly less efficient than the z1 / z1 version since we're now looping over the redundant # cells rather than pre-calculating them, but it shouldn't make any real world difference & I think the code ends up much more readable. 可能效率略低于z1 / z1版本,因为我们现在循环遍历冗余的#单元而不是预先计算它们,但它不应该产生任何真正的世界差异并且我认为代码最终会更具可读性。

/*
Initialize the 2-D array.
*/      
String array2D[] = { 
                    "mvjlixape",
                    "jhbxeenpp",
                    "hktthbswy",
                    "rwainuyzh",
                    "ppfxrdzkq",
                    "tpnlqoyjy",
                    "anhapfgbg",
                    "hxmshwyly",
                    "ujfjhrsoa" 
                    };
    // Print 2D array diagonally  for left top to right down
            for(int j = 0; j < array2D.length; j ++){
                for(int i = 0; i < array2D.length; i++){
                    if(i+j >= array2D.length)
                        break;
                    System.out.print(array2D[i].charAt(i+j));
                }
                System.out.println();
            }
            for(int j = 1; j < array2D.length; j ++){
                for(int i = 0; i < array2D.length; i++){
                    if(i+j >= array2D.length)
                        break;
                    System.out.print(array2D[i + j].charAt(i));
                }
                System.out.println();
            }

            // Print diagonally right top to left bottom diagonal
            for(int j = 0; j < array2D.length; j++){
                for(int i = j; i >= 0; i--){
                    System.out.print(array2D[j - i].charAt(i));
                }
                System.out.println();
            }
            for(int j = 1; j < array2D.length; j ++){
                for(int i = j; i < array2D.length; i++){
                    System.out.print(array2D[array2D.length - i + j - 1].charAt(i));
                }
                System.out.println();
            }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM