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等等。它以螺旋模式打印,就像蛇游戏一样,蛇会继续前进,直到撞到自己为止。

我想知道这个金字塔生成背后是否有任何算法,或者它只是棘手的耗时金字塔生成程序。

提前致谢。这是一个非常有趣的具有挑战性的计划,所以我恳请不需要投票管道:)

4

3 回答 3

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

您可以使用双 for 循环来调用它。x 和 y 从 0 开始:

for (int y=0; y<=n; y++) 
  for (int x=0; x<=n; x++) 
    result[x,y] = Determine(n,x,y);
于 2011-06-24T20:08:48.467 回答
1

这是实现@C.Zonnerberg 提交的基本算法的一些 C 代码,我的示例n=6用于 6x6 数组。

我必须进行一些更改才能获得我期望的输出方式。我交换了大部分x'sandy's并更改了几个n'ston-1并将 for 循环中的比较从<=to<

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,
于 2011-06-24T21:46:12.160 回答
0

使用全零数组,您可以从 [row,col] = [0,0] 开始,填充此空间,然后将 [0,1] 添加到位置(右侧一个)直到它位于末尾或运行成非零。

然后向下(添加 [1,0]),填充空间直到它结束或运行到非零。

然后向左走(添加 [0,-1]),填充空间直到它结束或运行到非零。

然后向上(添加 [-1,0]),填充空间直到它结束或运行到非零。

并重复...

于 2011-06-24T19:47:51.153 回答