kburnik

C++ - Zadatak SPIRALA

Feb 10th, 2013
89
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×