Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <cstdlib>
- using namespace std;
- enum {MAGIC_SQ = 0, SEMIMAGIC_SQ, NOT_MAGIC_SQ};
- int is_magic_square (int **, const size_t);
- void print_square (int **, const size_t);
- int main (void)
- {
- size_t n;
- int **arr = NULL;
- const char *res[] = {"IT'S A MAGIC SQUARE", "IT'S A SEMIMAGIC SQUARE", "IT'S NOT A MAGIC SQUARE"};
- cout << "Enter the size of the square: ";
- cin >> n;
- arr = new int *[n];
- for (size_t i = 0; i < n; i++)
- arr[i] = new int[n];
- cout << "Enter the values of the square:\n";
- for (size_t j = 0; j < n; j++)
- for (size_t i = 0; i < n; i++)
- cin >> arr[j][i];
- cout << endl;
- print_square(arr, n);
- cout << endl << res[is_magic_square(arr, n)] << endl ;
- for(size_t i = 0; i < n; ++i)
- delete [] arr[i];
- delete [] arr;
- system("pause");
- return 0;
- }
- // печать квадрата
- void print_square (int **square, const size_t m)
- {
- for (size_t j = 0; j < m; j++)
- {
- for (size_t i = 0; i < m; i++)
- cout << setw(5) << square[j][i];
- cout << "\n\n";
- }
- }
- // определение на магичность
- int is_magic_square (int **square, const size_t m)
- {
- const size_t vec_size = m * 2 + 2; // размер вектора +2 для диагоналей
- int *vec = new int[vec_size]; // вектор сумм
- int j, i, vc = 0;
- fill_n(vec, vec_size, 0); // заполняем вектор сумм нулями
- // вычисление суммы строк
- for (j = 0; j < m; j++, vc++)
- for (i = 0; i < m; i++)
- vec[vc] += square[j][i];
- // вычисление суммы столбцов
- for (i = 0; i < m; i++, vc++)
- for (j = 0; j < m; j++)
- vec[vc] += square[j][i];
- // первая диагональ
- for (j = 0; j < m; j++)
- vec[vc] += square[j][j];
- vc++;
- // вторая диагональ
- for (i = m - 1, j = 0; i >= 0; i--, j++)
- vec[vc] += square[j][i];
- // проверка на равенство сумм строк, столбцов, диагоналей
- for (j = 0; j < vec_size - 1; j++)
- if (vec[j] != vec[j + 1]) break;
- delete []vec;
- if (j + 1 == vec_size) // если совпали все суммы
- return MAGIC_SQ; // магический квадрат
- else if (j + 1 == vec_size - 2)
- return SEMIMAGIC_SQ; // полумвгический
- else
- return NOT_MAGIC_SQ; // не магический
- }
Advertisement
Add Comment
Please, Sign In to add comment