
На С++ Магический квадрат Магическим квадратом называют таблицу, в которой записаны числа 1,2,3,…
по одному разу, так что сумма чисел в каждой строке и в каждом столбце равные. Мы расскажем вам об одном из методов построения магических квадратов (его называют сиамским). Он годится только для построения квадратов с нечётной стороной (3×3,5×5,…). Поставим число 1 в верхнюю клетку центрального столбца. Далее будем двигаться по диагонали вправо-вверх, расставляя в клетки последовательно числа 2,3,4,…. Если мы вышли за пределы таблицы вверх, то нужно перейти к нижней клетке того же столбца и продолжить с неё. Если мы вышли за правую границу, нужно перейти к левой клетке той строки, куда мы должны были попасть. Если же мы одновременно вышли и вверх, и вправо, то нужно перейти в левую нижнюю клетку квадрата. Если в следующей клетке на нашем пути уже стоит число, то вместо хода “вправо-вверх” нужно сделать ход “вниз” (опять же, если мы при этом выйдем за границы квадрата, нужно перейти к верхней клетке того же столбца). Примеры для квадратов 3×3 и 5×5 показаны на рисунках.

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

Ответ: Только не точь в точь, а то за это бан)
#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-=1;
}
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;
}
У вас есть 4-ая? Я щас создам вопрос!
Если помогло, оцени)



Вы можете создать магический квадрат согласно описанному методу в C++. Вот пример реализации для квадрата 3x3:
cpp#include <iostream>
#include <vector>
void generateSiameseMagicSquare(int n) {
if (n % 2 == 0) {
std::cout << "The Siamese method is only applicable to odd-sized squares." << std::endl;
return;
}
std::vector<std::vector<int>> magicSquare(n, std::vector<int>(n, 0));
int row = 0;
int col = n / 2;
int num = 1;
while (num <= n * n) {
magicSquare[row][col] = num;
num++;
int nextRow = (row - 1 + n) % n;
int nextCol = (col + 1) % n;
if (magicSquare[nextRow][nextCol] == 0) {
row = nextRow;
col = nextCol;
} else {
row = (row + 1) % n;
}
}
// Print the magic square
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
std::cout << magicSquare[i][j] << "\t";
}
std::cout << std::endl;
}
}
int main() {
int n;
std::cout << "Enter the size of the magic square (must be odd): ";
std::cin >> n;
generateSiameseMagicSquare(n);
return 0;
}
Этот код создаст магический квадрат заданной нечетной размерности (например, 3x3) с использованием сиамского метода. Вы можете ввести размерность квадрата в программу, и она выведет его на экран. Помимо этого, вы можете адаптировать код для других нечетных размеров квадратов.


Похожие вопросы
Топ вопросов за вчера в категории Информатика







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