結果
問題 | No.217 魔方陣を作ろう |
ユーザー | maine_honzuki |
提出日時 | 2020-12-24 01:30:42 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 1,867 bytes |
コンパイル時間 | 2,321 ms |
コンパイル使用メモリ | 206,872 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-09-21 16:41:15 |
合計ジャッジ時間 | 3,204 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
testcase_04 | AC | 2 ms
5,376 KB |
testcase_05 | AC | 2 ms
5,376 KB |
testcase_06 | AC | 2 ms
5,376 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | AC | 2 ms
5,376 KB |
testcase_10 | AC | 2 ms
5,376 KB |
testcase_11 | AC | 2 ms
5,376 KB |
testcase_12 | AC | 2 ms
5,376 KB |
testcase_13 | AC | 2 ms
5,376 KB |
testcase_14 | AC | 2 ms
5,376 KB |
testcase_15 | AC | 2 ms
5,376 KB |
testcase_16 | AC | 2 ms
5,376 KB |
testcase_17 | AC | 2 ms
5,376 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; vector<vector<int>> solve(int N) { vector<vector<int>> magic(N, vector<int>(N)); if (N & 1) { int i = 0, j = N / 2, num = 1; while (num <= N * N) { magic[i][j] = num++; (i += N - 1) %= N; (j += 1) %= N; if (magic[i][j]) (i += 2) %= N, (j += N - 1) %= N; } } else if (N % 4 == 0) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { magic[i][j] = i * N + j + 1; } } for (int i = 0; i < N; i++) { for (int j = 0; j < N / 2; j++) { if (i % 4 == j % 4 || i % 4 == 3 - (j % 4)) swap(magic[i][j], magic[N - 1 - i][N - 1 - j]); } } } else { auto origin = solve(N / 2); for (auto& V : origin) for (auto& x : V) (x -= 1) *= 4; int LUX[3][2][2] = {{{4, 1}, {2, 3}}, {{1, 4}, {2, 3}}, {{1, 4}, {3, 2}}}; auto lux = [](int N, int i, int j) { if (i > N / 2 + 1) return 2; if ((i == N / 2 && j == N / 2) || (i == N / 2 + 1 && j != N / 2)) return 1; return 0; }; for (int i = 0; i < N / 2; i++) { for (int j = 0; j < N / 2; j++) { for (int k = 0; k < 2; k++) { for (int l = 0; l < 2; l++) { magic[i * 2 + k][j * 2 + l] = origin[i][j] + LUX[lux(N / 2, i, j)][k][l]; } } } } } return magic; } int main() { int N; cin >> N; auto magic = solve(N); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cout << magic[i][j] << " "; } cout << endl; } }