Guest User

magic square

a guest
Apr 19th, 2013
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cstdlib>
  4.  
  5. using namespace std;
  6.  
  7. enum {MAGIC_SQ = 0, SEMIMAGIC_SQ, NOT_MAGIC_SQ};
  8.  
  9. int  is_magic_square (int **, const size_t);
  10. void print_square    (int **, const size_t);
  11.  
  12. int main (void)
  13. {
  14.     size_t n;
  15.     int **arr = NULL;
  16.     const char *res[] = {"IT'S A MAGIC SQUARE", "IT'S A SEMIMAGIC SQUARE", "IT'S NOT A MAGIC SQUARE"};
  17.    
  18.     cout << "Enter the size of the square: ";
  19.     cin >> n;
  20.    
  21.     arr = new int *[n];
  22.     for (size_t i = 0; i < n; i++)
  23.         arr[i] = new int[n];
  24.    
  25.     cout << "Enter the values of the square:\n";
  26.     for (size_t j = 0; j < n; j++)
  27.         for (size_t i = 0; i < n; i++)
  28.             cin >> arr[j][i];
  29.    
  30.     cout << endl;
  31.     print_square(arr, n);
  32.     cout << endl << res[is_magic_square(arr, n)] << endl ;
  33.  
  34.     for(size_t i = 0; i < n; ++i)
  35.         delete [] arr[i];
  36.     delete [] arr;
  37.    
  38.     system("pause");
  39.     return 0;
  40. }
  41.  
  42. // печать квадрата
  43. void print_square (int **square, const size_t m)
  44. {
  45.     for (size_t j = 0; j < m; j++)
  46.     {
  47.         for (size_t i = 0; i < m; i++)
  48.             cout << setw(5) << square[j][i];
  49.         cout << "\n\n";
  50.     }
  51. }
  52.  
  53. // определение на магичность
  54. int is_magic_square (int **square, const size_t m)
  55. {
  56.     const size_t vec_size = m * 2 + 2;  // размер вектора  +2 для диагоналей
  57.     int *vec = new int[vec_size];       // вектор сумм
  58.     int j, i, vc = 0;
  59.    
  60.     fill_n(vec, vec_size, 0);           // заполняем вектор сумм нулями
  61.  
  62.     // вычисление суммы строк  
  63.     for (j = 0; j < m; j++, vc++)
  64.         for (i = 0; i < m; i++)
  65.             vec[vc] += square[j][i];
  66.    
  67.     // вычисление суммы столбцов
  68.     for (i = 0; i < m; i++, vc++)
  69.         for (j = 0; j < m; j++)
  70.             vec[vc] += square[j][i];
  71.    
  72.     // первая диагональ
  73.     for (j = 0; j < m; j++)
  74.         vec[vc] += square[j][j];
  75.    
  76.     vc++;
  77.  
  78.     // вторая диагональ
  79.     for (i = m - 1, j = 0; i >= 0; i--, j++)
  80.         vec[vc] += square[j][i];
  81.    
  82.     // проверка на равенство сумм строк, столбцов, диагоналей  
  83.     for (j = 0; j < vec_size - 1; j++)
  84.         if (vec[j] != vec[j + 1]) break;
  85.    
  86.     delete []vec;
  87.  
  88.     if (j + 1 == vec_size)          // если совпали все суммы
  89.         return MAGIC_SQ;            // магический квадрат
  90.     else if (j + 1 == vec_size - 2)
  91.         return SEMIMAGIC_SQ;        // полумвгический
  92.     else
  93.         return NOT_MAGIC_SQ;        // не магический
  94. }
Advertisement
Add Comment
Please, Sign In to add comment