Advertisement
Stranck

Perfect square

Jun 1st, 2017
187
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include<iostream>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. int** allocate(int l){
  7.     int** a = new int*[l];
  8.     for(int i = 0; i < l; i++)
  9.         a[i] = new int[l];
  10.     return a;
  11. }
  12.  
  13. int sumX(int** a, int l, int x){
  14.     int sum = 0;
  15.     for(int y = 0; y < l; y++) sum += a[x][y];
  16.     return sum;
  17. }
  18.  
  19. int sumY(int** a, int l, int y){
  20.     int sum = 0;
  21.     for(int x = 0; x < l; x++) sum += a[x][y];
  22.     return sum;
  23. }
  24.  
  25. int sumDP(int** a, int l){
  26.     int sum = 0;
  27.     for(int i = 0; i < l; i++) sum += a[i][i];
  28.     return sum;
  29. }
  30.  
  31. int sumDS(int** a, int l){
  32.     int sum = 0, n = l;
  33.     for(int i = 0; i < l; i++) sum += a[i][--n];
  34.     return sum;
  35. }
  36.  
  37. bool verify(int** a, int l){
  38.     bool b = true;
  39.     int sum = sumX(a, l, 0), n = 1;
  40.    
  41.     while((n < l) && b){
  42.         b = sumX(a, l, n) == sum;
  43.         n++;
  44.     }
  45.    
  46.     n = 0;
  47.     while((n < l) && b){
  48.         b = sumY(a, l, n) == sum;
  49.         n++;
  50.     }
  51.    
  52.     return b && (sumDP(a, l) == sum) && (sumDS(a, l));
  53. }
  54.  
  55. void fill(int** a, int l, int n){
  56.     for(int x = 0; x < l; x++)
  57.         for(int y = 0; y < l; y++)
  58.             a[x][y] = n;
  59. }
  60.  
  61. void print(int** a, int l){
  62.     for(int x = 0; x < l; x++) {
  63.         for(int y = 0; y < l; y++)
  64.             cout << a[x][y] << "\t";
  65.         cout << endl;
  66.     }
  67. }
  68.  
  69. int nextD(int n, int l){
  70.     if(--n < 0) n = l - 1;
  71.     return n;
  72. }
  73.  
  74.  
  75. int nextI(int n, int l){
  76.     if(++n >= l) n = 0;
  77.     return n;
  78. }
  79.  
  80.  
  81. int main(){
  82.     int l, i = 1, xNew, yNew, xOld, yOld = 0;
  83.    
  84.     do{
  85.         cin >> l;
  86.     }while((l % 2) == 0);
  87.    
  88.     int** a = allocate(l);
  89.     fill(a, l, 0);
  90.     xOld = l / 2;
  91.     a[xOld][yOld] = 1;
  92.    
  93.     while(++i <= (l * l) ){
  94.        
  95.         xNew = nextD(xOld, l);
  96.         yNew = nextD(yOld, l);
  97.        
  98.         if(a[xNew][yNew] == 0) {
  99.            
  100.             a[xNew][yNew] = i;
  101.             xOld = xNew;
  102.             yOld = yNew;
  103.            
  104.         } else {
  105.            
  106.             yOld = nextI(yOld, l);
  107.             a[xOld][yOld] = i;
  108.            
  109.         }
  110.        
  111.     }
  112.    
  113.     print(a, l);
  114.     if(verify(a, l)) cout << "True\n"; else cout << "False\n";
  115. }
Advertisement
RAW Paste Data Copied
Advertisement