Заполнение квадратной матрицы по спирали по часовой стрелке от центра
Я знаю, что решения задачи есть, но хотелось написать свой код. Суть: есть файл с квадратной матрицей нечетной размерности, надо написать код, который ее считывает и заполняет своими же значениями по спирали, а потом находит наибольший элемент. Это все на СИ, то есть без применения векторов. Функцию с нахождением наибольшего элемента пока не трогал, так как основная часть не работает. Программа компилируется, выводит на экран матрицу, которую считал из файла, но функция заполнения по спирали не работает. Скажите, в чем проблема?
#include <stdlib.h>
#define N 7
float spiral(double matrix[N][N]) {
FILE* file2 = fopen("output.txt", "w");
if (!file2)
exit(EXIT_FAILURE);
double M[N][N];
size_t i, j;
for (int k = 0; k < N / 2; k++) {
//while (k < N / 2) {
for (j = N / 2 - k; i = N / 2 + k; j < N / 2 + k && j++)
M[i][j] = matrix[i][j];
for (i = N / 2 + k; i > N / 2 - k; i--)
M[i][j] = matrix[i][j];
for (j = N / 2 + k; j > N / 2 - k; j--)
M[i][j] = matrix[i][j];
for (i = N / 2 - k; i < N / 2 + k; i++)
M[i][j] = matrix[i][j];
printf("%lf ", M[i][j]);
fprintf(file2, "%lf ", M[i][j]);
}
fclose(file2);
double main(int argc, char** argv) {
double matrix1[N][N];
size_t i, j;
FILE* file = fopen("input.txt", "r");
if (!file)
exit(EXIT_FAILURE);
for (i = 0; i < N && !feof(file); i++) {
for (j = 0; j < N && !feof(file); j++) {
fscanf(file, "%lf", &matrix1[i][j]);
printf("%lf ", matrix1[i][j]);
}
putchar('\n');
}
fclose(file);
return spiral(matrix1);
return (EXIT_SUCCESS);
}
Ответы (1 шт):
Автор решения: rotabor
→ Ссылка
Ну хочется поделиться своим решением, правда, на c#:
using System;
class Program{
static void Main(){
string of, bl;
int N, root, rows, columns, zR, zC, dR = 0, dC = 1;
Console.Write("Enter a natural number: ");
while (!int.TryParse(Console.ReadLine(), out N) | N < 1) {
Console.WriteLine("Not a natural number");
}
{ int i = N.ToString().Length + 1;
of = "{0," + i + "}";
bl = new String(' ', i); }
rows = columns = root = (int)Math.Sqrt(N);
if (N > root * root) columns++; zC = (columns - 1) / 2;
if (N > root * root + root) rows++; zR = (rows - 1) / 2;
var sp = new int[rows, columns];
for (int i = 1, k = 1, l = 0; i <= N; i++) {
sp[zR, zC] = i; zR += dR; zC += dC; l++;
if (l == k){
if (dC == 0) {k++; dC = 0 - dR; dR = 0;}
else {dR = dC; dC = 0;}
l = 0;
}
}
// вывод результата
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++)
if (sp[i, j] == 0) Console.Write(bl); else Console.Write(of, sp[i, j]);
Console.WriteLine();
}
Console.ReadLine();
}
}
-->
Enter a natural number: 100
73 74 75 76 77 78 79 80 81 82
72 43 44 45 46 47 48 49 50 83
71 42 21 22 23 24 25 26 51 84
70 41 20 7 8 9 10 27 52 85
69 40 19 6 1 2 11 28 53 86
68 39 18 5 4 3 12 29 54 87
67 38 17 16 15 14 13 30 55 88
66 37 36 35 34 33 32 31 56 89
65 64 63 62 61 60 59 58 57 90
100 99 98 97 96 95 94 93 92 91
Однопроходный алгоритм с минимальным количеством условных операторов.