2011-06-24 18 views
2

我遇到了這個非常有趣的在金字塔中打印數字的程序。非常有趣的建築金字塔計劃

如果n = 1,則打印以下,

1 2 
4 3 

如果n = 2,則打印以下,

1 2 3 
8 9 4 
7 6 5 

如果n = 3,則打印以下,

1 2 3 4 
12 13 14 5 
11 16 15 6 
10 9 8 7 

我可以使用相當多的循環和變量來打印所有這些,但它看起來非常具體。您可能已經注意到,所有這些金字塔填充都從一個方向開始,直到找到路徑填充。正如你可能已經注意到1,2,3,4,5,6,7,8,9,10,11,12在外邊緣提交直到它找到1,所以在它在12之後的第二行之後,並且打印13,14等等。它以螺旋模式打印,就像蛇遊戲蛇繼續前進,直到它自身擊中。

我想知道是否有任何算法背後這個金字塔代或它只是棘手的時間消費金字塔生成程序。

在此先感謝。這是一個非常有趣的具有挑戰性的程序,所以我懇請不需要管道投票:)

+2

我會說'spiral'而不是「金字塔」。 – tibur

+0

我在邏輯上同意其螺旋形,但在物理上它的金字塔 – u449355

+0

這種模式被稱爲[螺旋矩陣](http://rosettacode.org/wiki/Spiral_matrix)(請參閱41種語言解決方案的鏈接)。 – DarkDust

回答

3

我做了一個小的遞歸算法爲您的問題。

public int Determine(int n, int x, int y) 
{ 
    if (y == 0) return x + 1;   // Top 
    if (x == n) return n + y + 1;  // Right 
    if (y == n) return 3 * n - x + 1; // Bottom 
    if (x == 0) return 4 * n - y + 1; // Left 
    return 4 * n + Determine(n - 2, x - 1, y - 1); 
} 

您可以使用double for循環來調用它。在0 x和y的開始:

for (int y=0; y<=n; y++) 
    for (int x=0; x<=n; x++) 
    result[x,y] = Determine(n,x,y); 
+0

@ C.Zonnerberg - 我發現這很有趣,只是爲了好玩,我決定在C中嘗試一下。爲了獲得所需的輸出,我必須對上述算法進行一些更改。我在大多數地方交換了x和y,並將幾個n改爲n-1。 (我會發布C代碼和它的輸出作爲答案) – dave

+0

是的,絕對是一個經典的一個接一個:你需要你的'n'到'n-1',因爲從0開始計數。從那裏,+1。 – DarkDust

+0

我希望我可以爲此解決方案再頒發一次+1,因爲我發現它比[Rosetta Code](http://rosettacode.org/wiki/Spiral_matrix)上的大多數解決方案更優雅。 – DarkDust

0

用全零數組,你可以從[row,col] = [0,0]開始,填寫這個空間,然後將[0,1]添加到位置(右邊一個),直到它結束或運行到非零。

然後下去(添加[1,0]),填充空間,直到它結束或運行到非零。

然後向左(添加[0,-1]),填充空間直到它結束或運行到非零。

然後向上(添加[-1,0]),填充空間直到它結束或運行到非零。

,並重復...

1

下面是實施提交@ C.Zonnerberg我的示例使用n=6爲6×6陣列的基本算法的一些C代碼。

我不得不做一些改變,以得到我期望它看起來的樣子。我換大多數的x'sy's,改變了幾個n'sn-1的,改變了比較在for循環從<=<

int main(){ 
    int x,y,n; 
    int result[6][6]; 
    n=6; 
    for (x=0; x<n; x++){ 
    for (y=0; y<n; y++) { 
     result[x][y] = Determine(n,x,y); 
     if(y==0) 
     printf("\n[%d,%d] = %2d, ", x,y, result[x][y]); 
     else 
     printf("[%d,%d] = %2d, ", x,y, result[x][y]); 
    } 
    } 
return 0; 
} 

int Determine(int n, int x, int y) 
{ 
    if (x == 0) return y + 1;   // Top 
    if (y == n-1) return n + x;  // Right 
    if (x == n-1) return 3 * (n-1) - y + 1; // Bottom 
    if (y == 0) return 4 * (n-1) - x + 1; // Left 
    return 4 * (n-1) + Determine(n - 2, x - 1, y- 1); 
} 

輸出

[0,0] = 1, [0,1] = 2, [0,2] = 3, [0,3] = 4, [0,4] = 5, [0,5] = 6, 
[1,0] = 20, [1,1] = 21, [1,2] = 22, [1,3] = 23, [1,4] = 24, [1,5] = 7, 
[2,0] = 19, [2,1] = 32, [2,2] = 33, [2,3] = 34, [2,4] = 25, [2,5] = 8, 
[3,0] = 18, [3,1] = 31, [3,2] = 36, [3,3] = 35, [3,4] = 26, [3,5] = 9, 
[4,0] = 17, [4,1] = 30, [4,2] = 29, [4,3] = 28, [4,4] = 27, [4,5] = 10, 
[5,0] = 16, [5,1] = 15, [5,2] = 14, [5,3] = 13, [5,4] = 12, [5,5] = 11,