#include #include #include #include #include #include using namespace std; void row(vector >&A,int idx) { assert(0<=idx&&idx >&A,int idx) { assert(0<=idx&&idx >,vector >mp[2]; vectorsolve(vector >A_orig) { const int N=A_orig.size(); #define VAL(i,j) ((i)*N+(j)) for(int st=0;st<2;st++) { vectorR(N,0),C(N,0); auto A=A_orig; auto get=[&](int i,int j,int t){ assert(0<=i&&i >S(2,vector(2)); auto find=[&](int v){ for(int k=0;k<4;k++)if(V[k]==v)return k; return -1; }; S[0][0]=find(A[i][j]); S[0][1]=find(A[i][N-j-1]); S[1][0]=find(A[N-i-1][j]); S[1][1]=find(A[N-i-1][N-j-1]); if(mp[t].find(S)==mp[t].end())return(vector){-1}; else return mp[t][S]; }; if(st==1)row(A,0),R[0]=1; for(int j=0;j<=N-j-1;j++) { if(j){-1}) { C[j]=1,col(A,j); v=get(0,j,0); if(v==(vector){-1})return{-1}; } } else { int x=A[0][j],y=A[N-1][j]; int X=VAL(0,j),Y=VAL(N-1,j); if(x==X&&y==Y); else if(x==Y&&y==X)C[j]=1,col(A,j); else return{-1}; } } for(int i=1;i<=N-i-1;i++) { if(i){-1}) { R[i]=1,row(A,i); v=get(i,0,0); if(v==(vector){-1})return{-1}; } } else { int x=A[i][0],y=A[i][N-1]; int X=VAL(i,0),Y=VAL(i,N-1); if(x==X&&y==Y); else if(x==Y&&y==X)R[i]=1,row(A,i); else return{-1}; } } { bool out=false; for(int i=0;i){-1})out=true; } if(out)continue; } A=A_orig; vectorrc,cc; for(int i=0;i<=N-i-1;i++)if(R[i]==1)rc.push_back(i); for(int i=0;i<=N-i-1;i++)if(C[i]==1)cc.push_back(i); vectorans; int t=0; if(rc.size()==cc.size()) { for(int i=0;i){-1}); for(int x:v)ans.push_back(x); } return ans; } return{-1}; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); for(int t=0;t<2;t++) {//mp (2 x 2) vector >S={{0,1},{2,3}}; mp[t][S]={}; queue > >Q; Q.push(S); while(!Q.empty()) { for(int x=0;x<2;x++)for(int y=0;y<2;y++) { vector >A=Q.front(); if(t==0)col(A,y),row(A,x),col(A,y),row(A,x); else row(A,y),col(A,x),row(A,y),col(A,x); if(mp[t].find(A)==mp[t].end()) { mp[t][A].push_back(x); mp[t][A].push_back(y); mp[t][A].push_back(x); mp[t][A].push_back(y); for(int v:mp[t][Q.front()])mp[t][A].push_back(v); Q.push(A); } } Q.pop(); } { //cout<<"t = "< >k=kk; //cout<<"{{"<>T; for(;T--;) { int N;cin>>N; vector >A(N,vector(N)); for(int i=0;i>A[i][j],A[i][j]--; auto p=solve(A); if(p==(vector){-1})cout<<"-1\n"; else { cout<