算法通过N X N网格创建对角线模式



我想知道解决标题中列出的问题的算法的名称,或解释如何做到这一点,我会仔细地解释它,考虑一下:

9 8 6
7 5 3
4 2 1

它表示一个3 x 3的网格,我想以所指出的顺序遍历网格。右底部是原点(0,0),左上角为(2,2)。

因此,在坐标中看起来像:

  1. (0,0)[级别1]
  2. (1,0)[级别2]
  3. (0,1)[级别2]
  4. (2,0)[级别3]
  5. (1,1)[级别3]
  6. (0,2)[级别3]
  7. (2,1)[级别4]
  8. (1,2)[级别4]
  9. (2,2)[级别5]

用级别表示某种迭代。

另外,如果可以使用Java甚至Java 8以一种很好的方式生成它,那么我很乐意看到它,因为我认为它是一种幼稚的循环方法。

我想将其用于为图形应用程序生成地形,就像传统的迭代方法(循环宽度上的循环,循环深度)一样,它会产生"奇怪"的随机模式,至少不是我想要的。<<<<<<<<<</p>

我认为我在伪代码中有一个想法,给定输入n

while x < 2 && y < 2
do
    "iterate over elements to the top right if they exist"
    if (x < 2) x++
    else
        if (y < 2) y++

这将导致预期的迭代。

您可以解决的一种方法是将每个数字视为一个带有左和顶部邻居的单个节点。

因此您的第一级将是以下内容:

 3
21

请求节点时,您将将其传递给1(0,0)的坐标,然后返回(x 1,y)和(x,y 1)给两个邻居。

然后,您可以再次使用其他任何节点来行走不同的路径。

下一个级别将由两个节点及其邻居组成,例如:

 6
53  

 5
42

因此,对于第二级和第2级和3级,您将获得4、5、5、6作为结果,您可以在进入下一个级别之前过滤式重复项。

这里的关键是循环浏览节点列表:

for(Node n: nodes)
{
    Node left = new Node(n.x+1, n.y);
    Node top = new Node(n.x, n.y+1);
    //store these nodes in result list
}

使用包含x和y坐标的节点类(您必须自己制作该对象)。也可能有一种更优雅的方法,但我只是想让您思考要解决的问题。

您不只想,每个 A[i][j]的每一个"递归级别", i + j = n n是递归的水平,是包含网格的数组?像

int[][] A = {{1,2,3},{4,5,6},{7,8,9}};
for(int n=0;n < A.length + A[0].length;n++) {
  for (int i=0;i<=n;i++) {
    int j = n - i;
    if(i<A.length && j<A[0].length)
      System.out.print(A[i][j]+" ");
  }
  System.out.println();
}

有一个

9 6 3
8 5 2
7 4 1

你得到

1
2 4
3 5 7
6 8
9

每行是迭代级别

您可以做的是两组双嵌套环,首先是左下三角形和对角线。然后是右上三角。您可以看到此运行为小提琴http://jsfiddle.net/salixalba/76zdlbp7/。

var size=5;
var x=0;
var y=0;
// Set up data array, store the index of the point
var data = new Array(size);
for(var i=0;i<size;++i) {
    data[i]=new Array(size);
}
var pos=1;
// Bottom right triangle
for(var i=0;i<size;++i) { // should be size
    for(var j=0;j<=i;++j) {
        x = size - i + j - 1;
        y = size - j - 1;
        data[y][x] = pos;
        console.log(i,j,x,y);        
        ++pos;
    }
}
// Top left triangle
for(var i=0;i<size-1;++i) {
    for(var j=0;j<size-1-i;++j) {
        x = j;
        y = size - i - j - 2;
        data[y][x] = pos;
        console.log(i,j,x,y);        
        ++pos;
    }
}
var res="";
for(var i=0;i<size;++i) {
    res = res + data[i].toString() + "n";
}
$("textarea#output").val(res);

最新更新