Страницы

Поиск по вопросам

суббота, 23 марта 2019 г.

Заполнение матрицы квадратной матрицы с конца

Помогите как заполнить матрицу 3х3 такими же числами в таком же порядке. Умею заполнять двумерный массив, но вот такие правила заполнения не имею описывать.
Картинка в качестве примера:

Вот так заполняю и вывожу обычно, как это можно исправить?
int[] number = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[,] matrix = new int[3, 3]; int index = 0; for (int i = 0; i < matrix.GetLength(0); i++) for (int j = 0; j < matrix.GetLength(1); j++) { matrix[i, j] = number[index]; index++; }
for (int i = 0; i < matrix.GetLength(0); i++) for (int j = 0; j < matrix.GetLength(1); j++) if (j == matrix.GetLength(1) - 1) Console.Write(matrix[i, j].ToString() + "
"); else Console.Write( matrix[i, j].ToString() + "\t");


Ответ

Например, так:
const int max = 3; int[,] matrix = new int[max, max]; int curr = 1; for (int diff = 1 - max; diff <= max - 1; diff++) { for (int i = 0; i < max; i++) { int j = i - diff; if (j < 0 || j >= max) continue; matrix[i, j] = curr++; } }
Проверяем:
for (int i = 0; i < max; i++) { for (int j = 0; j < max; j++) Console.Write(matrix[i, j] + " "); Console.WriteLine(); }
Результат:
4 2 1 7 5 3 9 8 6

Пояснение: У клеток каждой диагонали разность координат y и x постоянна. Минимальная разность для «самой верхней» диагонали, в ней лишь клетка (max - 1, 0), разность равна 1 - max. Минимальная разность для «самой нижней» диагонали, в которой клетка (0, max - 1) равна, разумеется, max - 1. Внешний цикл по этим самым диагоналям. Одна разность — одна диагональ.
Затем, в каждой диагонали проводим цикл по x-координате (в коде обозначена как i). Она может быть от 0 до max - 1. Но например для первой диагонали не все x возможны, т. к. в ней только один элемент. Поэтому мы действуем так: вычисляем x, имея разность y - x == diff, вычисляем y (в коде j). Проверяем, чтобы y опадало в промежуток от 0 до max - 1
В каждую найденную клетку записываем следующее число. Текущее число хранится, понятно, в переменной curr, и увеличивается на единицу после каждой записи в матрицу.

Комментариев нет:

Отправить комментарий