Advertisement
codegod313

MagicSquare(by Alesik)

Oct 23rd, 2019
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5.  
  6. void prinSquare(int **a, int n) {
  7.     cout << endl;
  8.     for (int i = 0; i < n; i++) {
  9.         for (int j = 0; j < n; j++) {
  10.             printf("%5d", a[i][j]);
  11.         }
  12.         cout << endl;
  13.     }
  14. }
  15.  
  16.  
  17. int formula(int n) {
  18.     return n*(n*n + 1) / 2;
  19. }
  20.  
  21. void init_square(int **a,int n) {
  22.     for (int i = 0; i < n; i++) {
  23.         a[i] = (int*)calloc(n,sizeof(int));
  24.     }
  25. }
  26.  
  27. void i_fill_gooooooood(int **a, int idF, int iF, int jM,int jF, int n) {
  28.     int i = iF, j = jF;
  29.     int id = idF;
  30.     while (id != idF + n * n - 1) {
  31.         i--;
  32.         j++;
  33.         if (i<iF && j>jM) {
  34.             i += 2;
  35.             j--;
  36.             a[i][j] = ++id;
  37.             continue;
  38.         }
  39.         if (i < iF) {
  40.             i = iF + n - 1;
  41.             if (j > jM) j = jM;
  42.             while (a[i][j] != 0) i--;
  43.             a[i][j] = ++id;
  44.         }
  45.         else
  46.         if (j > jM) {
  47.             j = jF - (n / 2);
  48.             while (a[i][j] != 0) j++;
  49.             a[i][j] = ++id;
  50.         }
  51.         else
  52.         if (a[i][j] != 0) {
  53.             i+=2;
  54.             j--;
  55.             a[i][j] = ++id;
  56.         }
  57.         else{
  58.             a[i][j] = ++id;
  59.         }
  60.     //prinSquare(a, n*2);
  61.     }
  62.    
  63. }
  64.  
  65. void oddSquare(int **a, int n) {
  66.     a[0][n / 2] = 1;
  67.     i_fill_gooooooood(a, 1, 0, n / 2 + n / 2, n / 2, n);
  68. }
  69.  
  70. void evenSquare(int **a, int n) {
  71.     a[0][(n / 2) / 2] = 1;
  72.     i_fill_gooooooood(a, 1, 0, (n / 2) / 2 + (n / 2) / 2, (n / 2) / 2, n / 2);
  73.     a[n / 2][n / 2 + (n / 2) / 2] = n * n / 4 + 1;
  74.     i_fill_gooooooood(a, n*n / 4 + 1, n / 2, n - 1, n / 2 + (n / 2) / 2, n / 2);
  75.     a[0][n / 2 + (n / 2) / 2] = n * n / 2 + 1;
  76.     i_fill_gooooooood(a, 1 + n * n / 2, 0, n - 1, n / 2 + (n / 2) / 2, n / 2);
  77.     a[n / 2][(n / 2) / 2] = (n*n / 4) * 3 + 1;
  78.     i_fill_gooooooood(a, (n*n / 4) * 3 + 1, n / 2, (n / 2) / 2 + (n / 2) / 2, (n / 2) / 2, n / 2);
  79.     int j;
  80.     for (int i = 0; i < n / 2; i++) {
  81.         for ( j = 0; j < (n / 2) / 2; j++) {
  82.             if (i == (n / 2) / 2 && j == 0) continue;
  83.             swap(a[i][j], a[i + n / 2][j]);
  84.         }
  85.         if (i == (n / 2) / 2) swap(a[i][j],a[i+n/2][j]);
  86.     }
  87.     for (int i = 0; i < n / 2; i++) {
  88.         for (j = n - ((n / 2) - 3) / 2; j < n; j++) {
  89.             swap(a[i][j], a[i + n / 2][j]);
  90.         }
  91.     }
  92. }
  93.  
  94. void doubleEvenSquare(int **a, int n) {
  95.     int id = 0;
  96.     for (int i = 0; i < n; i++) {
  97.         for (int j = 0; j < n; j++) {
  98.             id++;
  99.             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)) {
  100.                 a[i][j] = id;
  101.             }
  102.         }
  103.     }
  104.     id = 0;
  105.     for (int i = n-1; i > -1; i--) {
  106.         for (int j = n-1; j > -1; j--) {
  107.             id++;
  108.             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))) {
  109.                 a[i][j] = id;
  110.             }
  111.         }
  112.     }
  113.     //prinSquare(a, n);
  114. }
  115.  
  116.  
  117.  
  118. int main()
  119. {
  120.     int n, **a;
  121.     cin >> n;
  122.     int f = formula(n);
  123.     a = (int **)malloc(n * sizeof(int *));
  124.     init_square(a, n);
  125.     if (n == 1) {
  126.         cout << 1;
  127.         return 0;
  128.     }
  129.     else
  130.         if (n == 2) {
  131.             cout << "Doesn't exist";
  132.             return 0;
  133.         }
  134.         else
  135.             if (n % 2 != 0) {
  136.                 oddSquare(a, n);
  137.             }
  138.             else if (n % 2 == 0 && n % 4 != 0) {
  139.                 evenSquare(a, n);
  140.             }
  141.             else if (n % 4 == 0) {
  142.                 doubleEvenSquare(a, n);
  143.             }
  144.     prinSquare(a, n);
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement