通过n×n网格创建对角线图案的算法

时间:2014-01-30 12:48:42

标签: java algorithm math language-agnostic grid

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

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]
  10. 级别表示某种迭代。

    此外,如果可以使用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 个答案:

答案 0 :(得分:0)

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

所以你的第一级将如下:

 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坐标的节点类(您必须自己创建该对象)。也许有一种更优雅的方法,但我只是想让你思考你正在解决的问题。

答案 1 :(得分:0)

对于每个“递归级别”,您是否只想要每个A[i][j] i + j = n n是递归级别而A是包含网格的数组? 像

这样的东西
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();
}

A存在

9 6 3
8 5 2
7 4 1

你得到了

1
2 4
3 5 7
6 8
9

每一行都是一个迭代级别

答案 2 :(得分:0)

你可以做两组双嵌套循环,首先做左下角三角形和对角线。然后是右上角的三角形。您可以将其视为小提琴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);