4

私は Java でこの割り当てを受けましたが、それを行う方法についての手がかりが 1 つもありません。タスクは、整数 n > 0 を受け取り、*互いに内部で構築された n 個のフレームを出力することですが、内側のフレームには 4n+1 で構築された文字「X」が含まれ*ます。配列や文字列は使えません。

例: n=1 は以下を出力します:

*******
*     *
* * * *
*  *  *
* * * *
*     *
*******

n=2 は以下を出力します:

*************
*           *
* ********* *
* *       * *
* * *   * * *
* *  * *  * *
* *   *   * *
* *  * *  * *
* * *   * * *
* *       * *
* ********* *
*           *
*************

これは私がこれまでに持っているものです:

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int size = n * 6 + 1;
int x = 1;
int y = 1;

for (int i = 0; i < n; i = i + 1) {
    for (int i3 = 0; i3 < size; i3 = i3 + 1) {
        System.out.print("*");
    }

    System.out.println("");
    y = y + 1;

    for (int i1 = 0; i1 < size - 2; i1 = i1 + 1) {
        System.out.print("*");
        for (int i2 = 0; i2 < size - 2; i2 = i2 + 1) {
            System.out.print(" ");
        }

        System.out.println("*");
        y = y + 1;
    }

    for (int i4 = 0; i4 < size; i4 = i4 + 1) {
        System.out.print("*");
    }
}
4

1 に答える 1

2

この問題にはさまざまなアプローチがあります。これは最善ではないかもしれませんが、非常にシンプルで教育的な IMO です。

主なアイデアは、フレーム全体を印刷する方法を知る必要がないということです。その 1/4 を印刷する方法を知っているだけで済みます。次に、X の逆順で繰り返し、次にY の逆順で繰り返します。具体的には、Xの描画から始めましょう-その対角線の1つです。「X」に 4n+1 が必要な場合、それぞれに星*が付いた 4 つのアームがあり、中央に 1 つ - 合計で 4 * + 1 スター - したがって、明らかに、4n+1 == 4a+1 であり、各アームには正確に を持っています。XY デカルト座標系を使用しましょう。したがって、x == y の場合のみアスタリスクがあります。それ以外の場合は、そこに s スペースがあります。a*an *

for ( int y = 0; y < n; y++ ) {
  for ( int x = 0; x < n; x++ ) {
    System.out.print( ( x == y ) ? '*' : ' ' );
  }
  System.out.println();
}

次に、逆方向にも繰り返してミラー コピーを追加しましょう。

for ( int y = 0; y < n; y++ ) {
  for ( int x = 0; x < n; x++ ) {
    System.out.print( ( x == y ) ? '*' : ' ' );
  }
  for ( int x = n; x >= 0; x-- ) {
    System.out.print( ( x == y ) ? '*' : ' ' );
  }
  System.out.println();
}

それでは、有効なデカルトを取得してみましょう。

int x, y;
for ( y = -n; y <= n; y++ ) {
  for ( x = -n; x < 0; x++ ) {
    System.out.print( ( x == y || x == -y ) ? '*' : ' ' );
  }
  for ( ; x <= n; x++ ) {
    System.out.print( ( x == y || x == -y ) ? '*' : ' ' );
  }
  System.out.println();
}

そして最後に、それはただの

for ( int y = -n; y <= n; y++ ) {
  for ( int x = -n; x <= n; x++ ) {
    System.out.print( hasAsterisk( Math.abs(x), Math.abs(y) ) ? '*' : ' ' );
  }
  System.out.println();
}

たとえば、

static boolean hasAsterisk( int x, int y ) {
  return x == y;
}

このコードを拡張してフレームを処理すれば、準備完了です。フレームの各「クォート部分」は、*それぞれ n、合計 2n 文字のみです。クロス自体の長さは n (上記を参照) に中央のアスタリスク 1 つを加えたものです。要約すると、X と Y は int [-3n,3n] の範囲になります。その3n一部mを呼び出して、反復の範囲として使用します。

追加のヒントとして、数式は内側のクロス (つまりabs(x)<n,abs(y)<n) とフレーム自体で異なります。フレームの式は、X 軸の 2 つのアスタリスク三角形と Y 軸の 2 つの三角形が追加された 2 行ごとに配置されていることに気づけば、簡単に理解できます。

return (x <= n && y <= n ) ? x == y : ( ( x < y ) ? y % 2 == nMod2 : x % 2 == nMod2 );

于 2014-11-08T15:30:08.597 に答える