Pa nije fora Google, nego da se malo pokrenu vijuge.
Analiza
Primer matrice, date su kooordinate jer sadržaj nije bitan, koordinate počinju od 0 jer je tako u nizovima u skoro svim programskim jezicima.
Kod:
| (0,0) (0,1) (0,2) (0,3) (0,4) |
| |
| (1,0) (1,1) (1,2) (1,3) (1,4) |
| |
| (2,0) (2,1) (2,2) (2,3) (2,4) |
| |
| (3,0) (3,1) (3,2) (3,3) (3,4) |
| |
| (4,0) (4,1) (4,2) (4,3) (4,4) |
Spiralno ispisivanje sadržaja (krug po krug)
(0,0)->(0,1)->(0,2)->(0,3)->(0,4)->
(1,4)->(2,4)->(3,4)->(4,4)->
(4,3)->(4,2)->(4,1)->(4,0)->
(3,0)->(2,0)->(1,0)->
(1,1)->(1,2)->(1,3)->
(2,3)->(3,3)->
(3,2)->(3,1)->
(2,1)->
(2,2)
U opštem slučaju, ako je širina matrice m, a visina n
ispis ide ovako
prvi krug
od (0,0) do (0,m-1)
od (1,m-1) do (n-1,m-1)
od (n-1,m-2) do (n-1,0)
od (n-2,0) do (1,0)
drugi krug
od (1,1) do (1,m-2)
od (2,m-2) do (n-2,m-2)
od (n-2,m-3) do (n-2,1)
od (n-3,1) do (2,1)
i tako dalje
Ovde imamo 16 indeksa od kojih se 8 povećavaju za 1, a 8 smanjuju za jedan
od 8 indeksa koji se povećavaju 6 počinju od 0, a 2 od 1
od 8 indeksa koji se smanjuju 3 počinju od m-1, 3 od n-1, 1 od m-2, jedan od n-2
znači imamo 6 početnih indeksa
Treba nam petlja sa još 4 petlje unutar nje. Posle svake iteracije velike petlje ćemo prva dva od šest indeksa inkrementovati, a ostala četiri dekrementovati. Ali u svakoj od unutrašnjih treba inkrementovati brojač da bi znali kada smo ispisali celu matricu. Moguće da se dubljom analizom može eliminisati ovaj brojač i matematički utvrditi zavisnost broja iteracija (velikih) od dimenzija matrice, pa onda i dokle da se ide unutar poslednje, ali to je za matematičare, čak je moguće da bi imalo slabije performanse od prostog brojanja polja.
Kod:
Kod:
#include <stdio.h>
#define SIRINA 5
#define VISINA 5
int main(int argc, char* argv[])
{
int matrica[VISINA][SIRINA] = {
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25}
};
//početni indeksi
int a = 0; //ink
int b = 1; //ink
int c = VISINA - 1; //dek
int d = SIRINA - 1; //dek
int e = VISINA - 2; //dek
int f = SIRINA - 2; //dek
int ukupno = VISINA * SIRINA;
int brojac = 1;
int i,j;
while (1)
{
for (j = a; j <= d; j++, brojac++)
{
printf("%d\n", matrica[a][j]);
if (brojac >= ukupno) goto kraj;
}
for (i = b; i <= c; i++, brojac++)
{
printf("%d\n", matrica[i][d]);
if (brojac >= ukupno) goto kraj;
}
for (j = f; j >= a; j--, brojac++)
{
printf("%d\n", matrica[c][j]);
if (brojac >= ukupno) goto kraj;
}
for (i = e; i >= b; i--, brojac++)
{
printf("%d\n", matrica[i][a]);
if (brojac >= ukupno) goto kraj;
}
a++; b++; c--; d--; e--; f--;
}
kraj:
return 0;
}
Provereno radi.