/* -*- coding: utf-8 -*- * * 3732.cc: No.3732 Labyrinth Maker - yukicoder */ #include #include #include using namespace std; /* constant */ const int MAX_N = 1000; const int MAX_NN = MAX_N * MAX_N; /* typedef */ using vi = vector; /* 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; }