Отображение чисел в определенных формах

Я только что подумал об этой проблеме 15 минут назад, и хотя она кажется безумно простой, у меня возникла серьезная проблема с ответом.

В основном то, что я хотел бы сделать, основано на числе (n), заданном пользователем, я хотел бы нарисовать квадратную форму.

Пример: допустим, пользователь дает число 2, результат должен быть:

12
43

Теперь предположим, что пользователь дает число 3, результат должен быть:

123
894
765

так далее..

Пожалуйста, не давайте мне решение этой проблемы, мне просто нужна пара подсказок, которые помогут мне начать работу.

Я думал о том, чтобы сделать это с помощью простого java-класса, но мне все еще не удается преодолеть первое условие:

public class DrawSquareWithNumbers {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter your number: ");
        int number = scanner.nextInt();

        for (int i = 0; i <= number; i++) {
            if (i<number)
             System.out.print(i); 
             if (i>=number) {
                 System.out.println("\n"+i);
             }
        }

    }
}

Есть подсказка? Заранее спасибо.

Просто подумайте о цикле от 1 до числа * требуется число

Lone_Coder 30.05.2018 11:57

Было бы очень здорово рассчитать, что вы печатаете, с помощью формулы или чего-то еще, но я думаю, вам нужно сохранить свою квадратную матрицу перед ее печатью. Это упростит задачу, просто перебирайте позиции в порядке спирали.

Jorge.V 30.05.2018 11:57

Отличный совет, Хорхе. Я сделаю это и вернусь к вам.

Jesse James 30.05.2018 12:01

См. geeksforgeeks.org/print-a-given-matrix-in-spiral-form

Shanu Gupta 30.05.2018 12:14
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
83
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я думаю, вы хотите сделать матрицу nxn с введенным пользователем номером. Таким образом, вы можете проверить ввод, а затем использовать цикл как for (i = 1; i <= n; i ++) для строк и аналогично для столбца (для j = 0; j <= n; j ++), а затем вы можете распечатать желаемая форма. Поскольку вы просили дать вам только идею, я не публикую здесь код. Если где-то застряли, можете сослаться: https://www.google.com/amp/s/www.geeksforgeeks.org/print-a-given-matrix-in-spiral-form/amp/

Я думаю, ему нужны числа в форме спирали, поэтому, начиная с i = 0, j = 0 не сработает.

Jorge.V 30.05.2018 11:59

Это просто идея

Adya 30.05.2018 12:00

Хорошо, давай попробуем. Сначала предположим, что вам нужно сохранить матрицу перед ее печатью и что не существует волшебной формулы, позволяющей распечатать то, что вам нужно, за одну итерацию.

Теперь у вас есть матрица NxN, например, для 3 это будет 3x3, 9 позиций. Вместо того, чтобы решать эту проблему с помощью серии ifs некрасивым способом, вы можете использовать векторы направления для более чистого решения. Также предположим, что у вас есть еще одна матрица NxN, заполненная логическими значениями, для всех установлено значение false, которые будут представлять уже напечатанные позиции в матрице NxN, которые вы напечатаете в конце. Когда вы записываете число в окончательную матрицу NxN, вы устанавливаете логическое значение той же позиции в значение true в логической матрице.

Так, например, вы хотите распечатать позиции первой строки, 1 2 3. Вы перемещаетесь вправо для печати. Это будет направление (1,0), также известное как начальный вектор направления. Вы продвигаетесь по матрице NxN, используя эти координаты. Когда вы выходите за пределы матрицы (в данном примере ваша позиция x равна 3), вы уменьшаете свою позицию x на единицу и "вращаете" вектор направления (это должно быть сделано в отдельной функции). (1,0) будет вращаться до (0, -1). Вы продолжаете использовать этот вектор для итерации своей матрицы, вращая ее по мере необходимости. После первого полного круга вы попадете в уже напечатанную позицию перед выходом за пределы матрицы. Поэтому после каждой печати вы должны проверять не только, выходите ли вы за пределы матрицы, но и есть ли на этой позиции номер. Для этого вы используете логическую матрицу.

Вот как бы я решил это, вероятно, есть много других способов (и лучших). Для начала вы можете использовать нуль или знак в итоговой матрице и сохранить логическую матрицу.

  • Заранее создайте матрицу результатов и объявите переменную для текущего числа, начальное значение = 1, текущие координаты, начиная с (0,0), направление шага, начиная с «вправо»
  • Цикл запуска
  • Рассчитайте координаты следующего шага и проверьте его.
  • Если он не в матрице, измените направление и пересчитайте, перепроверьте
  • Если нет, то поместите число в матрицу, увеличьте его и выполните цикл.
  • Если это не бесплатно, то завершите цикл, распечатайте матрицу результатов
Ответ принят как подходящий

Так что я думаю, что просто потратил на это слишком много времени, но это интересная задача, поэтому я подумал, давайте попробуем.

Я реализовал версию кода для этого решения, и она работает достаточно хорошо, хотя, вероятно, она не самая чистая, поскольку я подошел ко всей проблеме задом наперед.

Вот мое решение, которое можно опробовать в Интернете (обратите внимание, что он сильно неоптимизирован и никоим образом не является хорошим Java-кодом. Если честно, это быстрая и грязная реализация):

https://ideone.com/97JB7Y

Идея довольно проста: сначала мы вычисляем правильное значение для каждой позиции в матрице, а затем распечатываем эту матрицу.

Давайте рассмотрим это более подробно:

Мы начинаем с создания матрицы для наших значений для печати:

При заданном размере n это

int[][] values = new int[n][n];

Теперь мы хотим вычислить правильное значение в каждой точке. Я выбрал «неправильный путь», начав не с первой точки, а с центра спирали.

В основном представьте себе эту матрицу с n = 3:

[1][2][3]
[8][9][4]
[7][6][5]

Вместо 1 я просто начинаю с 9. Причина этого в том, что на самом деле легче рассчитать положение по спирали от точки по спирали к точке.

Итак, начиная с этой центральной точки, мы выходим оттуда по спирали по кругу. Для матрицы

[1][2]
[4][3]

это означает, что мы посещаем 4 -> 3 -> 2 -> 1. А затем просто сохраняем правильное значение в матрице.

Единственная проблема с моим подходом заключается в том, что для матрицы с неравномерным размером (3, 5, 7 и т.д.) я все еще посещаю точки в порядке спирали, для 3x3 порядок посещения, например, 9 -> 4 -> 3 -> 2 -> 1 -> 8 -> 7 -> 6 -> 5, как показано на этой идеальной картинке, которую я полностью нарисовал в Paint:

Order of Evaluation

Это приводит к тому, что матрица результатов инвертируется как таковая:

[5][6][7]
[4][9][8]
[3][2][1]

Эту небольшую проблему легко решить, просто распечатав перевернутую матрицу еще раз, если n%2 != 0.

Надеюсь, я смогу помочь с другим подходом к проблеме.

Мне очень нравится твой ответ. Но не могли бы вы объяснить мне некоторые строки, которые я не понял? Типа: 1. double r = Math.floor(Math.sqrt(i)); / * Что такое r и почему вы его так рассчитали ?. * / 2. Формула для вычисления переменных row и col кажется мне довольно сложной. Не могли бы вы немного объяснить эти две строчки? 3. Не могли бы вы также пояснить следующую строку values[row + (n / 2)][col + ((n - 1) / 2)] = (n * n) - i;? 4. Какая польза от этого условия if (n % 2 == 0)? 5. И наконец, как вы «думали» придумать ответ?

Jesse James 30.05.2018 15:10

"На этой прекрасной картинке я полностью нарисовал краской": D Ура, оригинальный подход, начиная с середины

Jorge.V 30.05.2018 15:30

@JesseJames основная идея состоит в том, чтобы иметь 2 функции, которые всегда меняются между 0 -> 1 -> 0 -> -1 -> 0 -> 1 -> 2 -> 1 -> 0 -> -1 -> -2 -> -1 -> 0 и так далее и так далее. По сути, он просто вычисляет с помощью некоторой адаптированной векторной математики точку, которая вращается наружу от (0,0), и отображает ее в целочисленные значения. Для вашего третьего пункта: результат начинается с (0/0), чтобы сопоставить это с нашей матрицей, нам нужно немного сместить индекс. Строка всегда сдвигается на n/2, а столбец всегда сдвигается на (n-1)/2. Вы можете проверить это с помощью математической индукции, если хотите;)

Ben 30.05.2018 21:09

4. Условие состоит в том, чтобы просто проверить, есть ли у нас матрица с нечетной шириной / высотой, поскольку эти матрицы построены в обратном порядке. Это то, что я пытался визуализировать с помощью изображения Paint. И 5. У него был проект, когда виртуальная реальность становилась все более популярной, по визуализации солнечной системы. Объекты, вылетающие откуда-то по спирали, были одной из вещей, которые мы там делали. В принципе, можно было взять формулы оттуда, поэтому я подумал, почему бы и нет;)

Ben 30.05.2018 21:11

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