#include <iostream> #include <cstdio> #include <cstdlib> #include <iomanip> using namespace std; int main () { int n; cin>>n; int tab[25]; for(int i=1;i<25;i++) // pętla zapisuje wartość potęgę 2 liczby i dla 25 liczb tab[i]=i*i; int wielkosc; for(int i=1;i<25;i++) // Pętla sprawdza pomiędzy którymi liczbami z poprzedniej pętli mieśi się liczba n { if(tab[i]>n) { wielkosc=i; break; } } wielkosc=wielkosc+6; // ustala w miarę dokładną szerokość i wysokość tablicy int ciag[wielkosc][wielkosc]; // deklaracja tablicy dwuwymiarowej w której zapisywane będą liczby int g=wielkosc/2; // ustalanie środka tablicy. int spr=1; // deklaracja kilku liczb sprawdzajacych stan weza. int licz=1; int a=0; int x=g; int y=g; int b=0; for(int i=0;i<wielkosc;i++) // Zerowanie tablicy { for(int j=0;j<wielkosc;j++) { ciag[i][j]=0; } } for(int i=1;i<n+1;i++) // pętla dopisująca liczby dodatnie { if(spr==1) // Jeśli spr ==1 liczby są zapisywane w prawo { x++;// przesunięcie liczby o 1 w prawo ciag[y][x]=i; // przypisanie liczby a++; // zwiększenie liczniku if(a==licz) // sprawdzanie czy zapisano odpowiednią ilość liczb w prawo. ( "a" to jest licznik a zmienna "licz" to ilość liczb które powinny zostać zapisane w kąkretnym kierunku. Jeśli warunek nie zostanie spełniony kolejne przejście pętli dopiszę liczbe w prawo { spr++; b++; // informacja że został skonczony kierunek a=0; if(b==2) // sprwadzanie czy zmienily sie 2 razy kierunki { b=0; // zerowanie kierundkow licz=licz+2; // zwiekszanie liczby powtórzeń przejścia o 2 ( po przejściu tej lini w każdej kolejnej lini pionowej lub poziomej pojawią się 2 liczby więcej. } } } else if(spr==2) // Jeśli spr ==2 liczby są zapisywane w górę { y--;// przesunięcie liczby o 1 w góre ciag[y][x]=i; a++; if(a==licz) { spr++; b++; a=0; if(b==2) { b=0; licz=licz+2; } } } else if(spr==3)// Jeśli spr ==3liczby są zapisywane w lewo { x--; ciag[y][x]=i;// przesunięcie liczby o 1 w lewo a++; if(a==licz) { spr++; b++; a=0; if(b==2) { b=0; licz=licz+2; } } } else if(spr==4)// Jeśli spr ==4liczby są zapisywane w dół { y++; ciag[y][x]=i;// przesunięcie liczby o 1 w dół a++; if(a==licz) { spr=1; b++; a=0; if(b==2) { b=0; licz=licz+2; } } } } spr=1; // resetowanie wszystkich liczb mających na ceu sprawdzanie aktualnego stanu weza licz=1; a=0; x=g; y=g; b=0; for(int i=1;i<n+1;i++) // Ta sama pętla tylko że dla liczb ujemnych ( spr=1 to lewo 2 to dół 3 to prawo oraz 4 to góra.) { if(spr==1) { x--; ciag[y][x]=0-i; a++; if(a==licz) { spr++; b++; a=0; if(b==2) { b=0; licz=licz+2; } } } else if(spr==2) { y++; ciag[y][x]=0-i; a++; if(a==licz) { spr++; b++; a=0; if(b==2) { b=0; licz=licz+2; } } } else if(spr==3) { x++; ciag[y][x]=0-i; a++; if(a==licz) { spr++; b++; a=0; if(b==2) { b=0; licz=licz+2; } } } else if(spr==4) { y--; ciag[y][x]=0-i; a++; if(a==licz) { spr=1; b++; a=0; if(b==2) { b=0; licz=licz+2; } } } } for(int k=0;k<wielkosc;k++) // wyświetlenie liczb { for(int j=0;j<wielkosc;j++) { if(ciag[k][j]==0) // nie wyswietlanie zbednych zer. if(k==g && j==g) // watunek aby wyswietlilo sie zero tylko na środku. cout<<setw(4)<<ciag[k][j]; else cout<<setw(4)<<" "; else cout<<setw(4)<<ciag[k][j]; } cout<<endl; } getchar(); cin.ignore(); return 0; }