Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Zadatak: Spirala
- Ispisati matricu koja sadrzi spiralu brojeva od 0 do N ukljucivo.
- N <= 500.
- u centru matrice je pocetak spirale s brojem 0
- spirala krece prema sjeveru i okrece se u smjeru kazaljke na satu.
- Mjesta u matrici koje nisu popunjena spiralom ispisati kao prazna.
- Ispis poravnati na 3 znamenke, po jedan razmak izmedju dva broja.
- Složenost: Linearna o(N)
- Datum: 2013-02-11
- Autor: Kristijan Burnik, udruga informatičara Božo Težak
- Gmail: kristijanburnik
- */
- #include <iostream>
- #include <cstdlib>
- #include <cmath>
- using namespace std;
- int main() {
- int n;
- cin >> n;
- // spirala najvise lici kvadratu, stoga je stranica korijen(N)
- // radi malih dimenzija N, minimum je 2
- int maxsize = 2+(int)sqrt(n);
- int
- // matrica i smjerovi
- mat[maxsize][maxsize]
- , dirs[4][2] = { {-1,0} , {0,1} , {1,0} , {0,-1} }
- // ekstremi pozicije po komponentama
- , xmin = maxsize
- , ymin = maxsize
- , xmax = 0
- , ymax = 0
- // pocetna pozicija u matrici, x je redak, y je stupac
- , x = maxsize/2
- , y = maxsize/2
- // trenutni smjer, trenuti broj okreta, dulj. u tren. okretu, tren. dulj.
- , current_direction = 0
- , round = 0
- , round_length = 1
- , current_length = 0
- ;
- // popuni matricu s -1
- memset(mat, -1, maxsize * maxsize * sizeof(int));
- for (int i = 0; i <= n; i++ ) {
- // postavi broj u matricu
- mat[x][y] = i;
- // azuriraj ekstreme
- xmin = min(x,xmin);
- ymin = min(y,ymin);
- xmax = max(x,xmax);
- ymax = max(y,ymax);
- // pomak na iducu poziciju
- x += dirs[current_direction][0];
- y += dirs[current_direction][1];
- // broj korak trenutne runde
- current_length++;
- // kad smo zadovoljili duljinu
- if (current_length == round_length) {
- // resetiraj duljinu, promjeni smjer
- current_length=0;
- current_direction = (current_direction+1)%4;
- // broji novu rundu
- round++;
- if (round % 2 == 0){
- // duljina se poveca svake 2 runde
- round_length++;
- }
- }
- }
- // ispis unutar zabiljezenih ekstrema
- for (int sx = xmin; sx <= xmax; sx++ ) {
- for (int sy = ymin; sy <= ymax; sy++) {
- if (mat[sx][sy] < 0) {
- // negativne ispisi kao praznine (4 znaka)
- printf(" ");
- } else {
- // poravnaj izlaz na 3 znamenke
- printf("%3d ",mat[sx][sy]);
- }
- }
- printf("\n");
- }
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement