Печать рамки внутри рамки

Я получил это задание в Java, и у меня нет ни единого понятия о том, как это сделать. Задача состоит в том, чтобы получить целое число n > 0 и вывести число кадров n * внутри друг друга, в то время как внутренняя рамка будет иметь букву "X", построенную как 4n+1 *, Я не могу использовать массивы или строки.

Например: 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("*");
    }
}

1 ответ

Решение

Есть много разных подходов к этой проблеме. Это может быть не лучшим, но это довольно простой и образовательный ИМО.

Основная идея: вам не нужно знать, как напечатать весь кадр. Вам нужно только знать, как напечатать 1/4 из них - затем повторить это в обратном X-порядке, затем повторить в обратном Y-порядке. Давайте начнем с рисования X, в частности - одной его диагонали. Если "Х" должен иметь 4n + 1 *, у него есть 4 руки с a звезды каждый и один * в середине - на общую сумму до 4 * a + 1 звезда - так, очевидно, 4n+1 == 4a+1, и каждая рука должна иметь точно n*"S. Давайте используем XY декартову систему координат. Таким образом, у нас есть только звездочка, если x == y - иначе у нас есть s пробел.

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, добавленных к двум треугольникам на оси Y.

возврат ( x <= n && y <= n)? x == y: ( ( x

Другие вопросы по тегам