非常有趣的建筑金字塔计划

时间:2011-06-24 19:36:50

标签: algorithm spiral

我遇到过这个非常有趣的金字塔打印数字程序。

如果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等等。它以螺旋模式打印,像蛇一样,游戏蛇继续前进,直到它自身出现。

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

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

3 个答案:

答案 0 :(得分: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循环调用它。 x和y从0开始:

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

答案 1 :(得分:1)

以下是一些实现@ C.Zonnerberg提交的基本算法的C代码我的示例使用n=6作为6x6数组。

我不得不做一些改变,以便按照我预期的方式获得输出。我交换了x'sy's的大部分内容,并将n's中的几个更改为n-1,并将for循环中的比较从<=更改为{{1 }

<

输出

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

答案 2 :(得分:0)

使用全零数组,你可以从[row,col] = [0,0]开始,填充这个空格,然后将[0,1]添加到位置(一个在右边),直到它位于结束或进入非零。

然后向下(添加[1,0]),填入空格直到它结束或进入非零。

然后向左(添加[0,-1]),填入空格直到它结束或进入非零。

然后上升(添加[-1,0]),填入空格直到它结束或进入非零。

并重复......