2014-01-30 23 views
0

我想知道解決題目中列出的問題的算法的名稱,或解釋如何做到這一點,我會盡量仔細解釋它,考慮這一點:通過焦慮網格創建對角線模式的算法

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

這個級別的簡單算法沒有附加名稱。 –

+0

到目前爲止你有什麼? –

回答

0

你可以解決這個問題的一種方法是將每個數字想象成具有左邊和頂部鄰居的單個節點。

所以,你的第一個層次是以下幾點:

3 
21 

當請求的1(0,0),你會傳遞給它節點的座標,然後返回(X,Y + 1)和(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座標(你將不得不做出這樣的對象自己)一個節點類。也可能有一種更優雅的方法來解決這個問題,但我只是想讓你考慮一下你正在解決的問題。

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 

每一行都是迭代

+0

關閉,但想想要打印多少物品。您可以省略'j'循環,並根據公式計算'j = n - i'。另外,如你所說,你需要檢查'j'是否在網格中。 –

+0

抱歉,我編輯了它。 – Belag

+0

更好,但它仍然會打印兩倍的項目。通過使用min,你將會爲'j'指定負面指針的項目。在對'A [i] [j]'做任何事情之前,你應該檢查'0'= j && j

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