54 lines
1.3 KiB
C++
54 lines
1.3 KiB
C++
#include <iostream>
|
|
#include <cassert>
|
|
|
|
using namespace std;
|
|
|
|
using Coord = pair<int, int>;
|
|
|
|
constexpr int MAX_N = 45;
|
|
int n;
|
|
int magic_square[MAX_N][MAX_N];
|
|
|
|
Coord next_coord(Coord current_coord) {
|
|
Coord next_coord = current_coord;
|
|
next_coord.first = (next_coord.first + n - 1) % n;
|
|
next_coord.second = (next_coord.second + 1) % n;
|
|
if ((current_coord.first == 0 && current_coord.second == n - 1)
|
|
|| magic_square[next_coord.first][next_coord.second] != 0) {
|
|
return {(current_coord.first + 1) % n, current_coord.second};
|
|
}
|
|
return next_coord;
|
|
}
|
|
|
|
|
|
void print_magic_square(ostream& os = cout) {
|
|
for (int i = 0; i < n; i++) {
|
|
for (int j = 0; j < n; j++) {
|
|
os << magic_square[i][j] << " ";
|
|
}
|
|
os << endl;
|
|
}
|
|
os << endl;
|
|
}
|
|
|
|
void fill_magic_square() {
|
|
Coord current_coord = {0, (n - 1) / 2};
|
|
for (int num = 1; num <= n * n; num++) {
|
|
assert(magic_square[current_coord.first][current_coord.second] == 0);
|
|
magic_square[current_coord.first][current_coord.second] = num;
|
|
current_coord = next_coord(current_coord);
|
|
// print_magic_square(clog);
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
ios::sync_with_stdio(false);
|
|
cin.tie(nullptr);
|
|
cin >> n;
|
|
n = 2 * n - 1;
|
|
fill_magic_square();
|
|
print_magic_square();
|
|
|
|
return 0;
|
|
}
|