結果

問題 No.3732 Labyrinth Maker
コンテスト
ユーザー tnakao0123
提出日時 2026-09-22 15:17:43
言語 C++17
(gcc 15.3.0 + boost 1.92.0 + ACL)
コンパイル:
g++-15 -O2 -lm -std=c++17 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 128 ms / 2,000 ms
+ 971µs
コード長 2,084 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,731 ms
コンパイル使用メモリ 71,780 KB
実行使用メモリ 25,000 KB
最終ジャッジ日時 2026-09-22 15:19:01
合計ジャッジ時間 37,206 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge5_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 59
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

/* -*- coding: utf-8 -*-
 *
 * 3732.cc:  No.3732 Labyrinth Maker - yukicoder
 */

#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

/* constant */

const int MAX_N = 1000;
const int MAX_NN = MAX_N * MAX_N;

/* typedef */

using vi = vector<int>;

/* global variables */

int as[MAX_NN];
int ps[MAX_NN], ass[MAX_NN + 1], bs[MAX_NN];
vi rvs[MAX_N];

/* subroutines */

/* main */

int main() {
  int tn;
  scanf("%d", &tn);

  while (tn--) {
    int n;
    scanf("%d", &n);
    int nn = n * n;
    for (int i = 0; i < nn; i++) scanf("%d", as + i);

    if (! (n & 1)) {
      int k = 0;
      for (int y = 0, x = 0; x < n; x++) ps[k++] = y * n + x;
      for (int x = n - 1; x > 0;) {
	for (int y = 1; y < n; y++) ps[k++] = y * n + x;
	x--;
	for (int y = n - 1; y > 0; y--) ps[k++] = y * n + x;
	x--;
      }
    }
    else {
      int k = 0;
      for (int y = 0, x = 0; x < n; x++) ps[k++] = y * n + x;
      for (int x = n - 1; x > 1;) {
	for (int y = 1; y < n; y++) ps[k++] = y * n + x;
	x--;
	if (x == 1) break;
	for (int y = n - 1; y > 0; y--) ps[k++] = y * n + x;
	x--;
      }
      for (int y = n - 1; y > 0;) {
	for (int x = 1; x >= 0; x--) ps[k++] = y * n + x;
	y--;
	for (int x = 0; x < 2; x++) ps[k++] = y * n + x;
	y--;
      }
    }
    //for (int i = 0; i < nn; i++)
    //  printf(" %d,%d", ps[i] / n, ps[i] % n);
    //putchar('\n');

    for (int i = 0; i < nn; i++) ass[i + 1] = (ass[i] + as[ps[i]]) % n;
    if (ass[nn] != 0) { puts("-1"); continue; }
    
    for (int i = 0; i < n; i++) rvs[i].clear();
    for (int i = 1 + (n & 1); i <= nn; i++) rvs[ass[i]].push_back(i);

    int r = 0;
    while (r < n && (int)rvs[r].size() < n) r++;
    if (r >= n) { puts("-1"); continue; }
    auto &rv = rvs[r];
    //printf(" r=%d:", r);
    //for (auto i: rv) printf(" %d", i); putchar('\n');

    for (int u = 0, i = 0, id = 0; u < nn;) {
      bs[ps[u++]] = id;
      while (i < n && rv[i] == u) i++, id = (id + 1) % n;
    }

    for (int u = 0; u < nn; u++)
      printf("%d%c", bs[u] + 1, ((u + 1) % n) ? ' ' : '\n');
  }

  return 0;
}

0