Помогите как заполнить матрицу 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, и увеличивается на единицу после каждой записи в матрицу.
Комментариев нет:
Отправить комментарий