
С++ СРОЧНО! Магический квадрат Магическим квадратом называют таблицу, в которой записаны числа
1,2,3,… по одному разу, так что сумма чисел в каждой строке и в каждом столбце равные. Мы расскажем вам об одном из методов построения магических квадратов (его называют сиамским). Он годится только для построения квадратов с нечётной стороной (3×3,5×5,…). Поставим число 1 в верхнюю клетку центрального столбца. Далее будем двигаться по диагонали вправо-вверх, расставляя в клетки последовательно числа 2,3,4,…. Если мы вышли за пределы таблицы вверх, то нужно перейти к нижней клетке того же столбца и продолжить с неё. Если мы вышли за правую границу, нужно перейти к левой клетке той строки, куда мы должны были попасть. Если же мы одновременно вышли и вверх, и вправо, то нужно перейти в левую нижнюю клетку квадрата. Если в следующей клетке на нашем пути уже стоит число, то вместо хода “вправо-вверх” нужно сделать ход “вниз” (опять же, если мы при этом выйдем за границы квадрата, нужно перейти к верхней клетке того же столбца). Примеры для квадратов 3×3 и 5×5 показаны на рисунках. Входные данные На вход подается одно натуральное нечётное число N, не превосходящее 30 — размер квадрата. Выходные данные Выведите числа, записанные в квадрате. Выравнивать числа по столбцам не обязательно. Обратите внимание: требуется вывести именно магический квадрат, полученный применением указанного метода. Примеры Ввод Вывод 3 8 1 6 3 5 7 4 9 2 5 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9

Ответы на вопрос

Ответ:
#include <iostream>
#include <vector>
#include <cstdint>
using namespace std; template <class T>
istream& operator>>(istream &in, vector<T> &vec) { for (auto &it : vec) in >> it; return in;
}
template <class T>
ostream& operator<<(ostream &out, vector<T> &vec) { for (auto &it : vec) out << it << ' '; return out;
}
template <class T, class U>
istream& operator>>(istream &in, pair<T, U> &pair) { in >> pair.first >> pair.second; return in;
}
template <class T, class U>
ostream& operator<<(ostream &out, pair<T, U> &pair) { out << pair.first << ' ' << pair.second; return out;
}
signed main(void) { int32_t n; cin >> n; vector<vector<int64_t>> a(n, vector<int64_t>(n,-1)); int64_t x = 0, y = n/2; a[x][y] = 1; for(int32_t i = 2; i <= n*n; ++i) { int _x = x, _y = y; if(!x) { x = n-1; } else { --x; } if(y == n-1) { y = 0; } else { ++y; } if(a[x][y] != -1) { x= _x, y = _y; while(a[x][y] != -1) { if(x == n-1) { x = 0; } else { ++x; } } } a[x][y] = i; } for(int32_t i = 0; i < n; ++i) { cout << a[i] << '\n'; } return 0; }
Объяснение:



Для создания магического квадрата по методу Сиама вам нужно следовать алгоритму, описанному в задаче. Давайте создадим C++ программу для этого.
cpp#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
if (n % 2 == 0) {
cout << "Невозможно построить магический квадрат для четной стороны." << endl;
return 0;
}
vector<vector<int>> magicSquare(n, vector<int>(n, 0));
int row = 0;
int col = n / 2;
for (int num = 1; num <= n * n; num++) {
magicSquare[row][col] = num;
row--;
col++;
if (num % n == 0) {
row += 2;
col--;
} else {
if (row < 0) {
row = n - 1;
}
if (col == n) {
col = 0;
}
}
}
// Вывод магического квадрата
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << magicSquare[i][j] << " ";
}
cout << endl;
}
return 0;
}
Этот код сначала проверяет, что сторона квадрата нечетная. Затем он создает вектор magicSquare
размером n x n
и заполняет его числами, следуя правилам метода Сиама. Наконец, он выводит магический квадрат.
Просто скопируйте этот код в свою среду разработки C++, введите нечетное значение N
и выполните программу, чтобы получить магический квадрат.


Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili