// создать двумерный массив template <typename T> T** allocate_2d_matrix(int N1, int N2) { T** p = new T*[N1]; for (int i=0; i<N2; i++) p[i] = new T[N2]; return (p); } // освободить память, распределенную для массива template <typename T> void destroy_matrix(T** p, int N1, int N2) { for (int i=0; i<N2; i++) delete [] p[i]; delete [] p; } // заполнить массив случайными числами template <typename T> void fill(T** p, int N1, int N2) { for (int i=0; i<N1; i++) for (int j=0; j<N2; j++) p[i][j] = rand(); } // сумма строки template <typename T> T sum_row(T** p, int N1, int N2, int row) { assert(row < N1); return (std::accumulate(p[row], p[row] + N2, 0)); } // сумма столбца template <typename T> T sum_col(T** p, int N1, int N2, int col) { assert(col < N2); // может, и возможно как-то через std, но что-то сходу никак не придумать.. int sum = 0; for (int i=0; i<N1; i++) sum += p[i][col]; return (sum); } // проверка на магический квадрат template <typename T> bool is_magic(T** p, int N1, int N2) { int sum_base = sum_row(p, N1, N2, 0); // сумма с которой сравниваем все остальные суммы // сравнение сумм по строкам for (int i=1; i<N1; i++) { if (sum_base != sum_row(p, N1, N2, i)) return (false); } // сравнение сумм по столбцам for (int i=1; i<N2; i++) { if (sum_base != sum_col(p, N1, N2, i)) return (false); } // суммы по диагоналям int sum_diag1 = 0; int sum_diag2 = 0; for (int i=0; i<N1; i++) for (int j=0; j<N2; j++) { sum_diag1 += p[i][j]; sum_diag2 += p[i][N2-j-1]; } return (sum_base == sum_diag1) && (sum_base == sum_diag2); } void test_matrix() { const int N = 2; int** p = allocate_2d_matrix<int>(N, N); fill(p, N, N); std::cout << is_magic(p, N, N) << std::endl; destroy_matrix(p, N, N); } |