- Вывести матрицу по диагонали
- Цикл по диагонали через двумерный массив Java
- 2. Двумерный массив
- 3. Получение индексов строк и столбцов
- 4. Вывод
- Популярные посты
- 2d массив по диагонали заполнения
- 8 ответов
- Зацикливание По диагонали Через 2d массив Java
- 1. Обзор
- 2. Двумерный Массив
- 3. Получение индексов строк и столбцов
- 4. Заключение
Вывести матрицу по диагонали
Помогите пожалуйста, суть задания — создать матрицу со случайными числами и сделать 3 варианта вывода матрицы (полная и по диагоналям). Кто понимает как вывести с правого верхнего угла в левый нижний — допишите пожалуйста CASE 3.
P.S смог сделать только вывод полной матрицы и слева на право.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
import java.util.Random; //import java.util.stream.*; import java.util.Scanner; public class Matrix { public static void main(String[] args) { Random random = new Random(0); Scanner scan = new Scanner(System.in); //int sum = IntStream.of(number).sum(); int[][] number = new int[10][10]; int j; int i; System.out.println("Nacisnij 1, aby uzyskac pelnej matrycy"); System.out.println("Nacisnij 2, aby uzyskac przekatnej macierzy z lewej na prawo"); int a=scan.nextInt(); System.out.println("------------------------------------"); switch (a) { case 1: for ( i = 0; i number.length; i++) { for ( j = 0; j number.length; j++) { number[i][j] = random.nextInt(10); // number[i][j]= (int)Math.random()*10; } } for ( i = 0; i number.length; i++) { for ( j = 0; j number.length; j++) { System.out.print(number[i][j] + " "); } System.out.println(""); } // int sum = IntStream.of(i).sum(); // System.out.println(sum); break; case 2: int x = 0; int y = 0; int amount = 9; for(int z = 0; z amount; z++){ int rand = 1 + (int) (Math.random() * 9); number[rand] = new int [10]; number[y][x] = rand; x++; y++; } for( i = 0; i number.length; i++){ for( j = 0; j number[i].length; j++){ System.out.print(" "); System.out.print(number[i][j] + " "); } System.out.println(); }; break; case 3: }}}
Цикл по диагонали через двумерный массив Java
В этом руководстве мы увидим, как перебирать двумерный массив по диагонали. Предлагаемое нами решение можно использовать для квадратного двумерного массива любого размера.
2. Двумерный массив
Ключом к работе с элементами массива является знание того, как получить конкретный элемент из этого массива. Для двумерного массива мы используем индексы строк и столбцов для получения элементов массива. Для этой проблемы мы воспользуемся следующей схемой, чтобы показать, как получить эти элементы.
Далее нам нужно понять, сколько диагональных линий у нас в массиве, как показано на диаграмме. Мы делаем это, сначала получая длину одного измерения массива, а затем используя это, чтобы получить количество диагональных линий ( diagonalLines ) .
Затем мы используем количество диагональных линий, чтобы получить среднюю точку, которая поможет в поиске индексов строк и столбцов.
В этом примере средняя точка равна трем:
int length = twoDArray.length int diagonalLines = (length + length) - 1 int midPoint = (diagonalLines / 2) + 1
3. Получение индексов строк и столбцов
Чтобы перебрать весь массив, мы начинаем цикл с 1 до тех пор, пока переменная цикла не станет меньше или равна переменной diagonalLines .
Давайте также представим идею количества элементов в диагональной линии, назвав ее itemsInDiagonal . Например, в строке 3 на диаграмме выше есть 3 элемента (g, e, c), а в строке 4 — 2 (h, f). Эта переменная увеличивается на 1 в цикле, когда переменная цикла i меньше или равна midPoint . В противном случае он уменьшается на 1.
После увеличения или уменьшения itemsInDiagonal мы получаем новый цикл с переменной цикла j . Переменная j увеличивается от 0 до значения меньше itemsInDiagonal.
Затем мы используем переменные цикла i и j, чтобы получить индексы строки и столбца. Логика этого вычисления зависит от того, больше ли переменная цикла i, чем midPoint или нет. Когда i больше midPoint , мы также используем переменную длины для определения индексов строки и столбца:
int rowIndex; int columnIndex; if (i > else < itemsInDiagonal--; for (int j = 0; j < itemsInDiagonal; j++) < rowIndex = (length - 1) - j; columnIndex = (i - length) + j; items.append(twoDArray[rowIndex][columnIndex]); >>
4. Вывод
В этом руководстве мы показали, как перебирать квадратный двумерный массив по диагонали, используя метод, который помогает получать индексы строк и столбцов.
Как всегда, полный исходный код примера доступен на GitHub.
Популярные посты
2d массив по диагонали заполнения
Это очень глупый способ заставить его работать, но даже он не работает, потому что я не могу найти элементы второго столбца.
for (i = 0; i < arr.length; ++i) < for (n = 0; n < arr[0].length; ++n) < if (i == 0 && n == 0)< arr[i][n] = 0; >else if (i == 0 && n == 1) < arr[i][n] = 2; >else if (i == 1 && n == 0) < arr[i][n] = 3; >else if (n == 0) < arr[i][n] = arr[i - 1][n] - arr[i - 2][n] + 1 + arr[i - 1][n]; >else < arr[i][n] = arr[i][n - 1] - arr[i][n - 2] + 1 + arr[i][n - 1]; >> >
@nem nem не совсем на это смотрит. Довольно близко, хотя. Это в основном алгоритм, который сложнее визуализировать, чем на самом деле.
Это на самом деле оборотная сторона SO. Вопрос, который должен быть помечен как «Дубликат», получает оценку. Почти такой же вопрос уже существует здесь: stackoverflow.com/questions/1779199/…
8 ответов
Хорошо, если вы должны были перечислять индексы для этого шаблона заполнения, вы получили бы
0,0 1,0 0,1 2,0 1,1 0,2 2,1 1,2 2,2
Итак, вам нужно выполнить итерацию по общим двум индексам. То есть суммарная добавка. Как вы можете видеть, 0,0 итоговые значения 0, 1,0 и 0,1 всего 1 и т.д. Дайте нам что-то вроде этого:
Чтобы выполнить итерацию в этом диагональном шаблоне, мы можем сделать следующее:
// set up your matrix, any size and shape (MxN) is fine, but jagged arrays will break int[][] matrix = ,,>; // number is the value we will put in each position of the matrix int number = 1; // iterate while number is less than or equal to the total number of positions // in the matrix. So, for a 3x3 matrix, 9. (this is why the code won't work for // jagged arrays) for (int i = 0; number // we decrement col while incrementing row in order to traverse down and left row++; col--; > while (row >= 0); >
Обратите внимание, что хотя эта реализация будет работать для всех размеров (и форм) матрицы, она не будет настолько эффективной, насколько это возможно. Где n — matrix.length (предполагая квадратную матрицу), эта реализация является оптимальным алгоритмом класса O(n^2) в большой нотации O; однако он эффективно выполняет итерации 2*n^2 , тогда как оптимальное решение будет выполнять только n^2 .
Зацикливание По диагонали Через 2d массив Java
Узнайте, как выполнить цикл по диагонали в 2d-массиве в Java.
1. Обзор
В этом уроке мы увидим, как выполнить цикл по диагонали через двумерный массив. Решение,которое мы предлагаем, может быть использовано для квадратного двумерного массива любого размера.
2. Двумерный Массив
Ключом к работе с элементами массива является знание того, как получить конкретный элемент из этого массива. Для двумерного массива мы используем индексы строк и столбцов для получения элементов массива. Для этой проблемы мы будем использовать следующую диаграмму, чтобы показать, как получить эти элементы.
Далее нам нужно понять, сколько диагональных линий у нас в массиве, как показано на диаграмме. Мы делаем это, сначала получая длину одного измерения массива, а затем используя ее, чтобы получить количество диагональных линий ( Диагональные линии ) .
Затем мы используем количество диагональных линий, чтобы получить среднюю точку, которая поможет в поиске индексов строк и столбцов.
В этом примере средняя точка равна трем:
int length = twoDArray.length int diagonalLines = (length + length) - 1 int midPoint = (diagonalLines / 2) + 1
3. Получение индексов строк и столбцов
Чтобы выполнить цикл по всему массиву, мы начинаем цикл с 1 до тех пор, пока переменная цикла не станет меньше или равна переменной диагональные линии .
Давайте также представим идею количества элементов в диагональной линии, назвав ее элементы в диагонали . Например, строка 3 на приведенной выше диаграмме содержит 3 элемента (g, e, c), а строка 4-2 (h, f). Эта переменная увеличивается на 1 в цикле, когда переменная цикла i меньше или равна средней точке . В противном случае он уменьшается на 1.
После увеличения или уменьшения элементов По диагонали у нас появляется новый цикл с переменной цикла j . Переменная j увеличивается от 0 до тех пор, пока она не станет меньше itemsInDiagonal.
Затем мы используем переменные цикла i и j для получения индексов строк и столбцов. Логика этого вычисления зависит от того, является ли переменная цикла i больше средней точки |/или нет. Когда i больше средней точки , мы также используем переменную length для определения индексов строк и столбцов:
int rowIndex; int columnIndex; if (i > else < itemsInDiagonal--; for (int j = 0; j < itemsInDiagonal; j++) < rowIndex = (length - 1) - j; columnIndex = (i - length) + j; items.append(twoDArray[rowIndex][columnIndex]); >>
4. Заключение
В этом уроке мы показали, как выполнить цикл по диагонали через квадратный двумерный массив, используя метод, который помогает получить индексы строк и столбцов.
Как всегда, полный исходный код примера доступен на GitHub .