将\(1 \sim n^2\)放置在\(n\times n\)的棋盘当中,要求当前格子中的数字与其四连通的格子中的数字不相邻。
考虑将当前格子染成黑色,与其四连通的格子染成白色,即下标\((i,j)\)的格子,当\(i+j\)为偶数时染成黑色,\(i+j\)为奇数时染成白色,则颜色不同的格子中的数字不能相邻。
按从左至右,从上至下的顺序,优先安排黑色格子中的数字,黑色格子安排完毕后再安排白色格子中的数字,数字的安排顺序为\(1\sim n^2\)。
\(n=3\)的构造情况如下:
\[\begin{pmatrix} 1 & 6 & 2\\ 7 & 3 & 8\\ 4 & 9 & 5\\ \end{pmatrix} \]注意点
\(n\)为\(2\)的情况无解。
const int N=110;
int g[N][N];
int n;
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n;
int idx=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if((i+j) % 2 == 0)
g[i][j]=++idx;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if((i+j) % 2)
g[i][j]=++idx;
if(n == 2) puts("-1");
else
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(j == n-1) cout<<g[i][j]<<endl;
else cout<<g[i][j]<<' ';
}
}
//system("pause");
return 0;
}