Я собираюсь предположить, что это для проекта euler # 28 (я только что сделал эту проблему на днях). Секрет не в создании матрицы, а в реализации шаблона. Реализуйте шаблон, и вы можете просто сосчитать две диагонали, не создавая матрицу.
1, 3, 5, 7, 9, 13, 17, 21, 25, ..., n
Пропустить что-нибудь?
Что касается воссоздания спиральной матрицы, я думаю, что наилучшим способом было бы работать в обратном направлении после выяснения схемы. Начните с n и двигайтесь вниз до 1. Было бы намного проще поместить в матрицу 'n', чем 1.
Отредактировано:
Создать матрицу не так уж сложно после определения диагоналей (задача 28). Я поместил эти значения в матрицу, а затем "обошел" матрицу, заполняя все остальные значения на основе основных диагональных значений, которые я ранее заполнил в матрицу. Однако я трачу небольшое количество времени на определение двух основных диагоналей. Мне больше нравится решение IPC. Однако, как и другой метод, здесь приведен код для вычисления матрицы после . Я определил две основные диагонали. Пусть n относится к размеру сетки, например, 5.
int[,] t = new int[n, n];
int sizeOf = n - 1;
//Note that nums is the array of the two diagonals, which are already in sorted order based on my solution to problem 28.
//fill in diagonals
for (int diagNum = numsCount, i = sizeOf, j = 0; ; i--, j++)
{
if (diagNum < 3)
{
t[i, j] = 1;
break;
}
t[i, i] = nums[diagNum--];
t[i, j] = nums[diagNum--];
t[j, j] = nums[diagNum--];
t[j, i] = nums[diagNum--];
}
//finish filling in matrix
for (int i = sizeOf, c = 0; i > 1; i--, c++)
{
for (int j = i - 1; j > sizeOf - i; j--)
t[i, j] = t[i, i] - i + j;
for (int j = c + 1; j < sizeOf - c; j++)
t[c, j] = t[c, c] - j + c;
for (int j = c + 1; j < i; j++)
t[j, i] = t[c, i] - j + c;
for (int j = i - 1; j > c; j--)
t[j, c] = t[i, c] - i + j;
}