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 の後の 2 行目に移動して 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);
}

doubleforループを使用して呼び出すことができます。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'sandを交換しy'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

すべてゼロの配列を使用すると、[行、列] = [0,0] で開始し、このスペースを埋めてから、[0,1] を位置 (右に 1 つ) に追加して、最後または実行することができます。非ゼロに。

次に下に移動し ([1,0] を追加)、最後まで、またはゼロ以外になるまでスペースを埋めます。

次に、左に移動し ([0,-1] を追加)、最後まで、またはゼロ以外になるまでスペースを埋めます。

次に上に移動し ([-1,0] を追加)、最後まで、またはゼロ以外になるまでスペースを埋めます。

繰り返します...

于 2011-06-24T19:47:51.153 に答える