結果
問題 | No.217 魔方陣を作ろう |
ユーザー |
![]() |
提出日時 | 2017-05-08 22:15:23 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 29 ms / 5,000 ms |
コード長 | 2,919 bytes |
コンパイル時間 | 2,227 ms |
コンパイル使用メモリ | 200,600 KB |
最終ジャッジ日時 | 2025-01-05 00:12:09 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 18 |
ソースコード
#include "bits/stdc++.h"#define ALL(a) (a).begin(),(a).end()#define SORT(c) sort((c).begin(),(c).end())#define DESCSORT(c) sort(c.begin(), c.end(), greater<int>())using namespace std;using LL = long long int;using LD = long double;using pii = pair<int, int>;using pll = pair<LL, LL>;using pdd = pair<double, double>;using vi = vector<int>;using vvi = vector<vi>;using vvvi = vector<vvi>;using vl = vector<LL>;using vvl = vector<vl>;using vvvl = vector<vvl>;using vd = vector<double>;using vvd = vector<vd>;using vs = vector<string>;using vb = vector<bool>;using vvb = vector<vb>;const int INF = (1 << 30) - 1;const LL INF64 = ((LL)1 << 62) - 1;const double PI = 3.1415926535897932384626433832795;const int dy[] = { 0, 1, 0, -1 };const int dx[] = { 1, 0, -1, 0 };int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }LL gcd(LL x, LL y) { return y ? gcd(y, x % y) : x; }vvi hindu(int n, vvi table) {int x = n / 2, y = 0;int cnt = 1;while (cnt <= n * n) {table[y][x] = cnt;cnt++;x++;y--;if (x == n) x = 0;if (y < 0) y = n - 1;if (table[y][x]) {x = (x + n - 1) % n;y = (y + 2) % n;}}return table;}vvi diagonal(int n, vvi table) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {int x = i % 4, y = j % 4;if (x == y || 3 - x == y) {table[i][j] = i * n + j + 1;} else {table[i][j] = n * n - i * n - j;}}}return table;}vvi lux(int n, vvi table) {vvi tmpTable(n / 2, vi(n / 2));tmpTable = hindu(n / 2, tmpTable);for (int i = 0; i < n / 2; i++) {for (int j = 0; j < n / 2; j++) {tmpTable[i][j]--;tmpTable[i][j] *= 4;if (((i == (n / 4) && (j == (n / 4))) || ((i == (n / 4 + 1)) && (j != (n / 4)))) || ((i == (n / 4)) && (j == (n / 4)))) {// Utable[i * 2][j * 2] = tmpTable[i][j] + 1;table[i * 2 + 1][j * 2] = tmpTable[i][j] + 2;table[i * 2][j * 2 + 1] = tmpTable[i][j] + 4;table[i * 2 + 1][j * 2 + 1] = tmpTable[i][j] + 3;} else if (i > (n / 4 + 1)) {// Xtable[i * 2][j * 2] = tmpTable[i][j] + 1;table[i * 2 + 1][j * 2] = tmpTable[i][j] + 3;table[i * 2][j * 2 + 1] = tmpTable[i][j] + 4;table[i * 2 + 1][j * 2 + 1] = tmpTable[i][j] + 2;} else {// Ltable[i * 2][j * 2] = tmpTable[i][j] + 4;table[i * 2 + 1][j * 2] = tmpTable[i][j] + 2;table[i * 2][j * 2 + 1] = tmpTable[i][j] + 1;table[i * 2 + 1][j * 2 + 1] = tmpTable[i][j] + 3;}}}return table;}int main() {ios::sync_with_stdio(false);cin.tie(0);int n;cin >> n;vvi magic_square(n, vi(n));if (n % 2 == 1) {magic_square = hindu(n, magic_square);} else if (n % 4 == 0) {magic_square = diagonal(n, magic_square);} else {magic_square = lux(n, magic_square);}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cout << magic_square[i][j] << " ";}cout << endl;}return 0;}