Премини към съдържанието

Препоръчан отговор


Привет :) От доста време се ровя из интернет и разни книги и не мога да си реша проблема с една програма за запълване на двумерен целочислен масив . Условието е следното : " Да се състави програма за запълване на двумерен целочислен масив А[N,N] с естествените числа започвайки от 1 до NxN (N на квадрат ) с начало горния десен ъгъл на масива и запълването да става по диагонали , успоредни на главния диагонал " 

Мисля че трябва да се получи следното : 

Например при N = 5 , масивът трябва да се запълни с числата от 1 до 25 

  11 , 7 , 4 , 2 , 1 

  16 ,12  8 , 5, 3

  20 ,17,13,9, 6 

  23,21,18,14,10

  25,24,22,19,15

Нещото за което опитвам да се хвана е , че за всеки диагонал успореден на главния , ако приемем числата за А[j]  , разликата j-i е еднаква и намалява от n до -n 

например диагонала 4,5,6 има индекси съответно [0][2] , [1][3]  и [2][4] , където разликата j-i винаги е равна на 2 . 

При обхождане на главния диагонал разликата е равна на 0 .  

И така в горния десен ъгъл (А[0][4]) разликата е 4 и намалява до 0 при главния диагонал . 

След  това тази разлика намалява до -4 под главния диагонал . 

Това е моята логика с която за сега нищо не се получава и може би е доста грешна , но не се сещам за нещо друго . 

Ще съм много благодарен на малко помощ от вас :)

Поздрави :):) 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Интересна задачка :). Ако имаш някакъв код моля те сподели го, за да ти дадем насоки къде какво да пипнеш, а ако нямаш драсни някой друг ред и да работим по него.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)
#include <stdio.h>

int main() {
    const int n=6;
    int a[n][n];
    int i,j=0;
    
    int c=n-1;
    int r=0;
    
    do {
        for (i=0; i+r+c<n; ++i)
            a[r+i][c+i]=++j;
        if (c) --c;
        else ++r;
    } while (r<n);
    
    for (i=0; i<n; ++i) {
        for (j=0; j<n; ++j)
            printf("%5d",a[i][j]);
        printf("\n\n");
    }
}

 

Редактирано от ined (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 5 часа, ined написа:

#include <stdio.h>

int main() {
    const int n=6;
    int a[n][n];
    int i,j=0;
    
    int c=n-1;
    int r=0;
    
    do {
        for (i=0; i+r+c<n; ++i)
            a[r+i][c+i]=++j;
        if (c) --c;
        else ++r;
    } while (r<n);
    
    for (i=0; i<n; ++i) {
        for (j=0; j<n; ++j)
            printf("%5d",a[i][j]);
        printf("\n\n");
    }
}

 

Благодаря за бързия отговор :) Ще прегледам кода и ще се опитам да го осмисля кой ред какво прави . Ако нещо не ми е ясно ще ти пиша на ЛС :) 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ето ти още един начин:

#include <stdio.h>

int main(int argc, const char *argv[]) {
	const int N = 5;
	int i, j, arr[N][N];
	for (i = 0; i < N; i++) {
		for (j = 0; j < N; j++) {
			int diagonal = i + (N - 1 - j);
			int number = (1 + diagonal) * diagonal / 2 + i + 1;
			if (diagonal >= N) {
				int overflow = diagonal - N + 1;
				number -= (1 + overflow) * overflow / 2;
				number -= overflow * (overflow - 1) / 2;
			}
			arr[i][j] = number;
			printf("%3d", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 


Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.