[ A90 @ 24.03.2005. 19:15 ] @
Pozdrav svima,naime interesuje me da li bi neko od pregrst strucnjaka na ovom forumu znao kako napraviti program u C++,koji ce za ucitani "n" ispisivati matricu oblika:

n=5

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

Molim vas to mi je za maturski rad a zaista nemam nikakvu ideju kako da to uradim,pa ako to neko zna,a siguram sam da ima puno takvih molim vas da mi pomognete..
Unaprijed hvala!!

[Ovu poruku je menjao X Files dana 14.04.2009. u 09:27 GMT+1]
[ X Files @ 24.03.2005. 19:46 ] @
To sto tebi treba zove se spoljasnja spirala. Nisi naveo za koju
platformu Windows/Linux/Dos i okruzenje Microsoft/Borland ti
treba resenje.

Ako je u pitanju DOS, resenje vec imas u knjizi Ranka Lazica,
Programski Jezik C kroz primere (davno to bese) ...

[ pesicvladica @ 24.03.2005. 20:40 ] @
Dodices resenje sutra izmedju 3 i 5.
[ Goran Rakić @ 25.03.2005. 08:22 ] @
ja koliko vidim ovo nije ono sto je trazeno.
[ dragansm @ 25.03.2005. 09:50 ] @
brutal force resenje (nisam kompajlirao, nadam se da radi):

Code:

typedef enum { N, S, W, E } DIR;
DIR dir = W;
const int N = 5;
static int m[N][N]; // static inicijalizuje matricu na 0-matricu

int x = 0; y = 0;
for ( int i = 0; i < N*N; ++i)
{
    m[x][y] = i+1;
    
    bool bFindDir = FALSE;
    while( bFindDir )
    {
        switch(dir)
        {
        case N:
            if ( y == 0 || m[x][y-1] == 0 ) 
            {
                dir = W;
            }
            else
            {
                --y;
                bFindDir = TRUE;
            }
            break;
        case S:
            if ( y == N - 1 || m[x][y+1] == 0 ) 
            {
                dir = E;
            }
            else
            {
                ++y;
                bFindDir = TRUE;
            }
            break;
        case W:
            if ( x == N - 1 || m[x+1][y] == 0 ) 
            {
                dir = S;
            }
            else
            {
                ++x;
                bFindDir = TRUE;
            }
            break;
        case E:
            if ( x == 0 || m[x-1][y] == 0 ) 
            {
                dir = N;
            }
            else
            {
                --x;
                bFindDir = TRUE;
            }
            break;
        }
    }
}
[ Mihajlo Cvetanović @ 25.03.2005. 10:48 ] @
To je maturski rad? Meni vise lici na domaci zadatak...

Ovde je caka kako pretvoriti jedan pravac u drugi. Ako pretpostavimo da je korodinatna nula u gornjem levom uglu, imamo ovu transformaciju:


Code:
x0 y0   x1 y1
1  0    0  1
0  1   -1  0
-1 0    0 -1
0 -1    1  0


Brojevi oznacavaju sledeci korak: (1,0) je desno, (0,1) dole, (-1,0) levo, (0,-1) gore. Pravac se menja na kraju matrice ili kad naidjemo na vec popunjeni element matrice. Popunjavamo elemente matrice pocevsi od koordinate 0,0 i pocetnog pravca "desno". x i y su ovde zapravo delta-x i delta-y.

E, sad, ako malo pazljivije osmotrite gornju tabelu primeticete da y postaje x, a x dobija negativnu vrednost y, tako da promena pravca izgleda ovako:

temp = x;
x = -y;
y = temp;

Pretpostavljam da je sad lako napisati kod...

[Ovu poruku je menjao Mihajlo Cvetanović dana 25.03.2005. u 18:21 GMT+1]
[ Toyo @ 25.03.2005. 13:55 ] @
Ne znam kako ces objasniti profesoru da kod ima samo 4 glavne linije.
Nisam imao C kompajler da testiram, pa sam to uradio u Delphiju i radi dobro.

Sve u svemu to je samo malo zongliranja sa indeksima.
Ako ti treba nesto razjasnisti (komentari linija) javi na PP.

Code:

var
  m:array[1..100,1..100] of integer;
  i, pok, bpok, br:integer;
begin
  N :=6;
  br := n;
  bpok:=n;
  pok :=1;
  while bpok > 0 do
    begin
      for i := 1 to bpok  do
        begin
            m[n-br+1,n-br+i] := pok + i-1;
            m[br,n-br+i] := pok +(bpok*3)- i - 2;
            m[n-br+i,br] := pok + bpok+i-2 ;
            if i> 1 then
              m[n-br+i,n-br+1] := pok +(bpok*4)- i - 3;
        end;
      inc(pok,(bpok-1)*4);
      dec(bpok,2);
      dec(br);
    end;

end;

[ -Sami- @ 07.04.2009. 22:39 ] @
E ovako imam jedan zadatak koji mi je dao profa da vjezbam,al ja razbih glavu i nekontam kako ga uraditi (jbg jos sam pocetnik),a on nece jos da mi kaze kako to ide :)
Naime treba napisati Satnu matricu,tako da ona na izlazu daje (primjer n=4)

01 02 03 04
12 13 14 05
11 16 15 06
10 09 08 07



Testirati za N=8, 9, 11


Koliko znam matrice su nizovi nizova?

i kreiraju se ovako nekako:

................
Code:

int i,j,a[3][3];

for(i=0,i<3,i++);

for(j=0,j<3,j++);

cout<<"Unesi";
cin>>a[i][j];


...........


E sad vjerovatrno tu treba jos mnogo sto sta da se uradi,a ako neko ima vremena da napise (barem malo) bio bih mu zahvalan,poz.

p.s. nije zadaca,nego se spremamo za takmicenje nas par


[Ovu poruku je menjao X Files dana 14.04.2009. u 08:32 GMT+1]
[ peromalosutra @ 13.04.2009. 13:54 ] @
Ovaj zadatak je vec bio na takmicenju proslih godina, ali ne bih se zacudio da se opet pojavi. :)

Jedan od najjednostavnijih nacina je da kreiras matricu odgovarajucih dimenzija i inicijalizujes ju sa nulom. Zatim krenes od gornjeg ljevog ugla i krenes na onu stranu na koju ti pokazuje neka varijabla K koja oznacava smjer kretanja (recimo 0 desno, 1 dole, 2 ljevo, 3 gore). Ako je smjer kretanja ok (nije se doslo do granice matrice, ili do vec popunjenog polja) onda u to popunjeno polje upises vrijednost, a ako jeste onda promjenis smjer K i to sve radis dok ne dodjes u situaciju da za ma koji smjer K ne mozes da nadjes prazno polje. Tada program zavrsava sa radom i matrica je popunjena.
[ -Sami- @ 14.04.2009. 08:18 ] @
Hvala velika :)
[ Mihajlo Cvetanović @ 16.06.2009. 12:41 ] @
Slučajno sam video ovaj thread, pa reko da pokažem svoje rešenje. Radi i za ne kvadratne matrice:

Code:
int _tmain(int argc, _TCHAR* argv[])
{
    int mat[100][100] = {};
    int m = 5, n = 5; // velicina matrice
    int x = 0, y = 0; // pocetna koordinata
    int dx = 1, dy = 0; // pocetni pravac kretanja
    int i, j;

    for (i = 1; i <= m*n; ++i)
    {
        mat[y][x] = i;

        if (x + dx >= m || x + dx < 0 || y + dy >= n || y + dy < 0 || mat[y + dy][x + dx] != 0)
        {
            int temp = dx;
            dx = -dy;
            dy = temp;
        }

        x += dx;
        y += dy;
    }

    for (i = 0; i < n; ++i)
        for (j = 0; j < m; ++j)
            printf("%2d%s", mat[i][j], j < m - 1 ? " " : "\n");
}