Заполнить матрицу по спирали, начиная от середины и по диагонали влево - C (СИ)
Формулировка задачи:
Здравствуйте, уважаемые. Помогите разобрать в чем моя ошибка, пожалуйста.
Вот код:
Спираль должна выглядеть вот так:
(если size = 3)
2 3 4
9 1 5
8 7 6
(если 5)
10 11 12 13 14
25 2 3 4 15
24 9 1 5 16
23 8 7 6 17
22 21 20 19 18
int main()
{
int size;
int i,j;
int a[100][100];
printf("Size: ");
scanf("%d", &size);
int mi=size/2;
a[mi][mi] = 1;
int value = 1;
for (i = 1; i <=size; i++)
{
for (j = mi - i; j < mi + i; j++) a[mi - i][j] = ++value;
for (j = mi - i; j < mi + i; j++) a[j][mi + i] = ++value;
for (j = mi + i; j <= size - mi-i; j--) a[mi + i][j] = ++value;
for (j = mi + i; j <= size - mi-i; j--) a[j][mi - i] = ++value;
}
for (i=0; i < size; i++)
{
for (j=0; j < size; j++)
{
printf("%4.1d", a[i][j]);
}
printf("\n");
}
return 0;
}Решение задачи: «Заполнить матрицу по спирали, начиная от середины и по диагонали влево»
textual
Листинг программы
#include <stdio.h>
const int N = 9;
int main()
{
int i, j, n, x = 1, k, A[N][N];
if(N % 2 != 0){
k = N / 2;
n = 1;
A[k][k] = x;
x++;
while(k - n >= 0){
i = k - n;
for(j = k - n; j <= k + n; j++){
A[i][j] = x;
x++;
}
j--;
for(i = k - n + 1; i <= k + n; i++){
A[i][j] = x;
x++;
}
i--;
for(j = k + n - 1; j >= k - n; j--){
A[i][j] = x;
x++;
}
j++;
for(i = k + n - 1; i >= k - n + 1; i--){
A[i][j] = x;
x++;
}
i++;
n++;
}
}
else{
k = N / 2 - 1;
n = 0;
while(k - n >= 0){
i = k - n;
for(j = k - n; j <= k + n + 1;j++){
A[i][j] = x;
x++;
}
j--;
for(i = k - n + 1; i <= k + n + 1; i++){
A[i][j] = x;
x++;
}
i--;
for(j = k + n; j >= k - n; j--){
A[i][j] = x;
x++;
}
j++;
for(i = k + n; i >= k - n + 1; i--){
A[i][j] = x;
x++;
}
i++;
n++;
}
}
for(i = 0; i < N; i++){
for(j = 0; j < N; j++)
printf("%3d", A[i][j]);
printf("\n");
}
return 0;
}
Объяснение кода листинга программы
В этом коде заполняется матрица по спирали, начиная от середины и по диагонали влево. Вот список ключевых моментов:
- В первой строке определяется размер матрицы N = 9.
- Затем идет проверка на нечетность размера матрицы (если размер нечетный, то алгоритм будет отличаться).
- Далее, в зависимости от результата проверки, определяется значение переменной k, которая будет использоваться для заполнения матрицы.
- Затем, вне зависимости от размера матрицы, в основной цикл while заполняются все элементы матрицы.
- Внутри цикла while происходит заполнение матрицы по спирали, начиная от элемента A[k][k] (середина матрицы) и далее по диагонали влево.
- После заполнения матрицы, происходит её вывод на экран с помощью функции printf.
- В конце программы возвращается 0, что означает успешное выполнение программы.