C/C++

Основы программирования на C. Задача

Не думаю что кто-то сможет это решить, но на удачу задал вопрос, сам я уже задолбался, не могу это решить
fedorec_denis
fedorec_denis
621
"Не думаю что кто-то сможет это решить" - не судите по себе)
Если нужно не красивое, краткое, лаконичное решение, а просто хоть как-нибудь решить, то это довольно легко (уровень класса 10-го, наверное):
 #include  
#include

int N = 5; // число строк
int M = 8; // число столбцов
int** A; // указатель на массив

int main(void) {

// Выделяем память под массив:
A = (int**)malloc(sizeof(int) * N);
for (int i = 0; i < N; i++)
*(A + i) = (int*)malloc(sizeof(int) * M);

// Заполняем массив:
int x = 0, dx = 1, X1 = 0, X2 = M - 1;
int y = 0, dy = 0, Y1 = 0, Y2 = N - 1;
for (int z = 0; z < N * M; z++) {
A[y][x] = z;

x += dx;
y += dy;

if (x > X2) {
x--;
dx = 0;
dy = 1;
y++;
Y1++;
}

if (x < X1) {
x++;
dx = 0;
dy = -1;
y--;
Y2--;
}

if (y > Y2) {
y--;
dy = 0;
dx = -1;
x--;
X2--;
}

if (y < Y1) {
y++;
dy = 0;
dx = 1;
x++;
X1++;
}
}

// Выводим массив:
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++)
printf("\t%d", A[i][j]);
printf("\n");
}

return 0;
}
Дальше можно попробовать это все укоротить, причесать... но мне лень)
Вова Шутько
Вова Шутько
95 014
Лучший ответ
#define MAX 10
#include <stdio.h>
void sf(int m,int n,int a[][MAX]){
int val=1, k=0, l=0;
while(k<m && l<n){
for (int i=l;i<n;++i)a[k][i]=val++; k++;
for (int i=k;i<m;++i)a[i][n-1]=val++; n--;
if(k<m){for(int i=n-1;i>=l;--i)a[m-1][i]=val++; m--;}
if(l<n){for(int i=m-1;i>=k;--i)a[i][l]=val++; l++;}}}
int main(){
int m,n; printf("M N: "); scanf("%d%d",&m,&n); int a[MAX][MAX]; sf(m,n,a);
for (int i=0;i<m;i++){for(int j=0;j<n;j++)printf("%3d",a[i][j]); printf("\n");}
return 0;}
///*мейрбек*/// ///*халбаев*/// Ааа... мои глаза))
Не понимаю эстетику такого ужимания кучи операторов в одну строчку))
*** Віктор Голубєв*** P.S. То же касается пробелов между операциями и переменными. Для меня чем текст короче, тем легче читается. Хотя это и идет вразрез с обычными рекомендациями ;)
*** Віктор Голубєв*** О ходе конем - это по условию: "M и N не превышают 10". Зачем усложнять программу динамическим массивом... Хотя в C, в отличие от C+, допустимы массивы VLA, т.е. можно писать int a[m}[n], где m и n вводятся с клавиатуры. Но для 10х10 можно не стараться :)
Заполнение по спирали матрицы произвольного размера возрастающими числами
начиная с произвольно заданного начального числа на Си, реализованная по принципу конечного автомата. Помимо этого показана обработка аргументов командной строки, преобразование строки в число типа unsigned long, динамическое выделение памяти для работы с двумерным массивом и динамическое формирование ширины выводимого столбца в printf
https://pastebin.com/JXRzdzEE

Пример работы:
 ./app 3 2 
Спиральное заполнение матрицы возрастающими числами начиная с 0:
Матрица 3x2
[0][1][2]
[5][4][3]
./app 3 2 4
Спиральное заполнение матрицы возрастающими числами начиная с 4:
Матрица 3x2
[4][5][6]
[9][8][7]
./app 3 4
Спиральное заполнение матрицы возрастающими числами начиная с 0:
Матрица 3x4
[00][01][02]
[09][10][03]
[08][11][04]
[07][06][05]
./app 6 5 100
Спиральное заполнение матрицы возрастающими числами начиная с 100:
Матрица 6x5
[100][101][102][103][104][105]
[117][118][119][120][121][106]
[116][127][128][129][122][107]
[115][126][125][124][123][108]
[114][113][112][111][110][109]