Advertisement
kburnik

C++ - Zadatak SPIRALA

Feb 10th, 2013
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. /*
  2.     Zadatak: Spirala
  3.    
  4.             Ispisati matricu koja sadrzi spiralu brojeva od 0 do N ukljucivo.
  5.             N <= 500.
  6.            
  7.             u centru matrice je pocetak spirale s brojem 0
  8.             spirala krece prema sjeveru i okrece se u smjeru kazaljke na satu.
  9.            
  10.             Mjesta u matrici koje nisu popunjena spiralom ispisati kao prazna.
  11.             Ispis poravnati na 3 znamenke, po jedan razmak izmedju dva broja.
  12.            
  13.     Složenost: Linearna o(N)
  14.  
  15.     Datum: 2013-02-11
  16.  
  17.     Autor: Kristijan Burnik, udruga informatičara Božo Težak
  18.  
  19.     Gmail: kristijanburnik
  20.  
  21. */
  22. #include <iostream>
  23. #include <cstdlib>
  24. #include <cmath>
  25.  
  26. using namespace std;
  27.  
  28. int main() {
  29.     int n;
  30.     cin >> n;
  31.    
  32.     // spirala najvise lici kvadratu, stoga je stranica korijen(N)
  33.     // radi malih dimenzija N, minimum je 2
  34.     int maxsize = 2+(int)sqrt(n);
  35.    
  36.     int
  37.         // matrica i smjerovi
  38.         mat[maxsize][maxsize]
  39.       , dirs[4][2] = { {-1,0} , {0,1} , {1,0} , {0,-1} }
  40.      
  41.       // ekstremi pozicije po komponentama
  42.       , xmin = maxsize
  43.       , ymin = maxsize
  44.       , xmax = 0
  45.       , ymax = 0
  46.      
  47.       // pocetna pozicija u matrici, x je redak, y je stupac
  48.       , x = maxsize/2
  49.       , y = maxsize/2
  50.      
  51.       // trenutni smjer, trenuti broj okreta, dulj. u tren. okretu, tren. dulj.
  52.       , current_direction = 0
  53.       , round = 0
  54.       , round_length = 1
  55.       , current_length = 0
  56.     ;
  57.    
  58.     // popuni matricu s -1
  59.     memset(mat, -1, maxsize * maxsize * sizeof(int));
  60.    
  61.     for (int i = 0; i <= n; i++ ) {
  62.         // postavi broj u matricu
  63.         mat[x][y] = i;
  64.        
  65.         // azuriraj ekstreme
  66.         xmin = min(x,xmin);
  67.         ymin = min(y,ymin);        
  68.         xmax = max(x,xmax);
  69.         ymax = max(y,ymax);
  70.        
  71.         // pomak na iducu poziciju
  72.         x += dirs[current_direction][0];
  73.         y += dirs[current_direction][1];
  74.  
  75.         // broj korak trenutne runde
  76.         current_length++;
  77.         // kad smo zadovoljili duljinu
  78.         if (current_length == round_length) {
  79.             // resetiraj duljinu, promjeni smjer
  80.             current_length=0;
  81.             current_direction = (current_direction+1)%4;
  82.            
  83.             // broji novu rundu
  84.             round++;
  85.             if (round % 2 == 0){
  86.                 // duljina se poveca svake 2 runde
  87.                 round_length++;  
  88.             }
  89.         }
  90.     }
  91.    
  92.     // ispis unutar zabiljezenih ekstrema
  93.     for (int sx = xmin; sx <= xmax; sx++ ) {
  94.         for (int sy = ymin; sy <= ymax; sy++) {
  95.  
  96.             if (mat[sx][sy] < 0) {
  97.                 // negativne ispisi kao praznine (4 znaka)
  98.                 printf("    ");
  99.             } else {
  100.                 // poravnaj izlaz na 3 znamenke
  101.                 printf("%3d ",mat[sx][sy]);
  102.             }
  103.         }
  104.         printf("\n");
  105.     }
  106.  
  107.     system("pause");
  108.     return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement