簡體   English   中英

通過axn網格創建對角線圖案的算法

[英]Algorithm to create a diagonal pattern through a n x n 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級]

該級別表示某種迭代。

另外,如果可以使用Java甚至Java 8以一種不錯的方式生成此代碼,那么我很樂意看到它,因為我認為它作為一種幼稚的循環方法會更好。

我想用它來生成圖形應用程序的地形,因為使用傳統的迭代方法(寬度遍歷,深度遍歷),它會創建“奇怪的”隨機模式,至少不是我想要的模式。

給定輸入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是遞歸級別,而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();
}

有一個

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM