Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- using namespace std;
- void prinSquare(int **a, int n) {
- cout << endl;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- printf("%5d", a[i][j]);
- }
- cout << endl;
- }
- }
- int formula(int n) {
- return n*(n*n + 1) / 2;
- }
- void init_square(int **a,int n) {
- for (int i = 0; i < n; i++) {
- a[i] = (int*)calloc(n,sizeof(int));
- }
- }
- void i_fill_gooooooood(int **a, int idF, int iF, int jM,int jF, int n) {
- int i = iF, j = jF;
- int id = idF;
- while (id != idF + n * n - 1) {
- i--;
- j++;
- if (i<iF && j>jM) {
- i += 2;
- j--;
- a[i][j] = ++id;
- continue;
- }
- if (i < iF) {
- i = iF + n - 1;
- if (j > jM) j = jM;
- while (a[i][j] != 0) i--;
- a[i][j] = ++id;
- }
- else
- if (j > jM) {
- j = jF - (n / 2);
- while (a[i][j] != 0) j++;
- a[i][j] = ++id;
- }
- else
- if (a[i][j] != 0) {
- i+=2;
- j--;
- a[i][j] = ++id;
- }
- else{
- a[i][j] = ++id;
- }
- //prinSquare(a, n*2);
- }
- }
- void oddSquare(int **a, int n) {
- a[0][n / 2] = 1;
- i_fill_gooooooood(a, 1, 0, n / 2 + n / 2, n / 2, n);
- }
- void evenSquare(int **a, int n) {
- a[0][(n / 2) / 2] = 1;
- i_fill_gooooooood(a, 1, 0, (n / 2) / 2 + (n / 2) / 2, (n / 2) / 2, n / 2);
- a[n / 2][n / 2 + (n / 2) / 2] = n * n / 4 + 1;
- i_fill_gooooooood(a, n*n / 4 + 1, n / 2, n - 1, n / 2 + (n / 2) / 2, n / 2);
- a[0][n / 2 + (n / 2) / 2] = n * n / 2 + 1;
- i_fill_gooooooood(a, 1 + n * n / 2, 0, n - 1, n / 2 + (n / 2) / 2, n / 2);
- a[n / 2][(n / 2) / 2] = (n*n / 4) * 3 + 1;
- i_fill_gooooooood(a, (n*n / 4) * 3 + 1, n / 2, (n / 2) / 2 + (n / 2) / 2, (n / 2) / 2, n / 2);
- int j;
- for (int i = 0; i < n / 2; i++) {
- for ( j = 0; j < (n / 2) / 2; j++) {
- if (i == (n / 2) / 2 && j == 0) continue;
- swap(a[i][j], a[i + n / 2][j]);
- }
- if (i == (n / 2) / 2) swap(a[i][j],a[i+n/2][j]);
- }
- for (int i = 0; i < n / 2; i++) {
- for (j = n - ((n / 2) - 3) / 2; j < n; j++) {
- swap(a[i][j], a[i + n / 2][j]);
- }
- }
- }
- void doubleEvenSquare(int **a, int n) {
- int id = 0;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- id++;
- if ((i < n / 4 && j >= n / 4 && j < n - n / 4) || (i>=n/4 && i<n-n/4 && j < n / 4) || (i>=n/4 && i<n-n/4 && j>=n-n/4) || (i>=n-n/4 && j>=n/4 && j<=n-n/4)) {
- a[i][j] = id;
- }
- }
- }
- id = 0;
- for (int i = n-1; i > -1; i--) {
- for (int j = n-1; j > -1; j--) {
- id++;
- if (!((i < n / 4 && j >= n / 4 && j < n - n / 4) || (i >= n / 4 && i < n - n / 4 && j < n / 4) || (i >= n / 4 && i < n - n / 4 && j >= n - n / 4) || (i >= n - n / 4 && j >= n / 4 && j <= n - n / 4))) {
- a[i][j] = id;
- }
- }
- }
- //prinSquare(a, n);
- }
- int main()
- {
- int n, **a;
- cin >> n;
- int f = formula(n);
- a = (int **)malloc(n * sizeof(int *));
- init_square(a, n);
- if (n == 1) {
- cout << 1;
- return 0;
- }
- else
- if (n == 2) {
- cout << "Doesn't exist";
- return 0;
- }
- else
- if (n % 2 != 0) {
- oddSquare(a, n);
- }
- else if (n % 2 == 0 && n % 4 != 0) {
- evenSquare(a, n);
- }
- else if (n % 4 == 0) {
- doubleEvenSquare(a, n);
- }
- prinSquare(a, n);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement