Uzupełnienie macierzy

0

Witam. Mam taką sytuację:
Jest macierz XxY:

[ ][ ][ ][ ]
[ ][ ][ ][ ]
[ ][ ][ ][ ]

Teraz mam określone pola których wartość wynosi tyle co max(X,Y) czyli będzie coś takiego:

[ ][ ][4][ ]
[ ][ ][ ][ ]
[ ][4][ ][ ]

Muszę znaleźć algorytm który wypełnia teraz pola macierzy wartościami (max(X,Y))-(odległość od pola), czyli powstanie coś takiego:

[2][3][4][3]
[2][3][3][2]
[3][4][3][2]

Nie mam zielonego pomysłu jak to zaimplementować.

0

a czemu na skos od 4 masz 2?

0

Bo są 2 czwórki, jeżeli wartość w jakiejś komórce może być albo 3 albo 2, w zaleźności od którą komórkę rozpatrujemu to zawsze będzie większa wartość. Teraz rozpatruję dolną czwórkę bo będzie wtedy większa wartość.</url>

0

No dobra niby mam algorytm i chyba powinnien dzialac, ale jest to rozwazanie teoretyczne i nie sprawdzone, no i dodatko pewnie istnieje jakies lepsze.

W sumie to dla jednej wartosci to mozna sprobowac tak ze: znasz wartosc max(x,y) okreslmy to jako max, polozenie max w maciezy to (m,n), dodatkowo pozycja komorki pole to (i,j) i teraz wartosc kazdego pola mozna opisac wzorem:

pole = max - ( abs(m - i)  + abs(n - j) );

ten kod wykonany w dwoch petalch for powinien dac wartosci dla jednej liczby.

Aby zrobic to dla kilku to po prostu na poczatku wypelnij macierz na poczatku najmnijeszymi warotsciami a potem tylko sprawdzaj czy dana wartosc pola jest wieksza niz wartosc komorki ktora aktualnie badasz i jak tak to wstaw ta wartosc. A i musisz wtedy dla kazdej wartosc przeliczyc macierz od nowa co jesli macierz jest duza i wartosci sporo moze zabrac chwilke czasu.

Pozdrawiam.

PS. mam nadzieje ze dobrze zorzumialem jak dana maicierz ma wygladac.

0

No, nie było takie trudne jak się wydawało.

max=(Wx>Wy)?Wx:Wy;
while(N-i) {
                scanf("%d%d", &x, &y);
                field[x][y]=max;
                for(j=0;j<Y;j++){
                        for(k=0;k<X;k++) {
                                dist=(max-(abs(x-k)+abs(y-j))>0)?(max-(abs(x-k)+abs(y-j))):0;
                                field[k][j]=(field[k][j]<dist)?dist:field[k][j];
                        }
                }
                i++;
} // while

1 użytkowników online, w tym zalogowanych: 0, gości: 1