#![allow(non_snake_case,dead_code,unused_imports)] use proconio::{*,marker::*}; fn main(){ input!{ t:usize, } for _ in 0..t{ solve(); } } fn solve(){ input!{ n:usize, a:[[usize;n];n], } let mut sum=0; for p in iterp(n,n){ sum+=a[p]; } if sum%n!=0{ println!("-1"); return; } let mut ans=vec![vec![!0;n];n]; if n%2==0{ let cyc=cycle(P::new(0,0),P::new(n,n)); let mut sum=vec![vec![];n]; let mut cur=0; for (idx,&p) in cyc.iter().enumerate(){ sum[cur%n].push(idx); cur+=a[p]; } let mut is=sum.into_iter().max_by_key(|t|t.len()).unwrap(); is.truncate(n); assert!(is.len()==n); let mut it=1; for w in is.windows(2){ for &p in &cyc[w[0]..w[1]]{ ans[p]=it; } it+=1; } for &p in chain!(&cyc[is[n-1]..],&cyc[..is[0]]){ ans[p]=it; } } else{ let mut cyc=cycle(P::new(1,0),P::new(n,n)); cyc.push(P::new(0,0)); cyc.push(P::new(0,1)); let mut chi=vec![vec![P::new(!0,!0);n];n]; for i in 2..n{ chi[1][i]=P::new(0,i); } let mut sum=vec![vec![];n]; let mut cur=0; for (idx,&p) in cyc.iter().enumerate(){ sum[cur%n].push(idx); cur+=a[p]; if chi[p].in_range(n,n){ cur+=a[chi[p]]; } } let mut is=sum.into_iter().max_by_key(|t|t.len()).unwrap(); is.truncate(n); assert!(is.len()==n); let mut it=1; for w in is.windows(2){ for &p in &cyc[w[0]..w[1]]{ ans[p]=it; if chi[p].in_range(n,n){ ans[chi[p]]=it; } } it+=1; } for &p in chain!(&cyc[is[n-1]..],&cyc[..is[0]]){ ans[p]=it; if chi[p].in_range(n,n){ ans[chi[p]]=it; } } } for i in 0..n{ println!("{}",ans[i].iter().join(" ")); } } fn cycle(p:P,q:P)->Vec
{
assert!((p.i-q.i)%2==0);
let mut cyc=vec![];
for i in (p.i..q.i).step_by(2){
for j in p.j+1..q.j{
cyc.push(P::new(i,j));
}
for j in (p.j+1..q.j).rev(){
cyc.push(P::new(i+1,j));
}
}
for i in (p.i..q.i).rev(){
cyc.push(P::new(i,p.j));
}
cyc
}
use itertools::*;
trait ChangeMinMax:Copy+PartialOrd{
fn chmin(&mut self,a:Self)->bool{
*self>a && {
*self=a;
true
}
}
fn chmax(&mut self,a:Self)->bool{
*self ChangeMinMax for T{}
// library: https://github.com/rhoo19937/cp-lib
// LURD
const DD:[P;4]=[P{i:0,j:!0},P{i:!0,j:0},P{i:0,j:1},P{i:1,j:0}];
const DX:[P;8]=[P{i:0,j:!0},P{i:!0,j:!0},P{i:!0,j:0},P{i:!0,j:1},P{i:0,j:1},P{i:1,j:1},P{i:1,j:0},P{i:1,j:!0}];
#[derive(Clone,Copy,PartialEq,Eq,PartialOrd,Ord,Hash,Default)]
struct P{
i:usize,
j:usize,
}
impl P{
fn new(i:usize,j:usize)->P{
P{i,j}
}
fn in_range(self,h:usize,w:usize)->bool{
self.i for $t{
type Output=T::Output;
fn index(&self,idx:P)->&T::Output{
&self[idx.i][idx.j]
}
}
impl for $t{
fn index_mut(&mut self,idx:P)->&mut T::Output{
&mut self[idx.i][idx.j]
}
}
}
}
impl_p_index!([T]);
impl_p_index!(Vec