题目大意
给你一个整数n,你要找到一个大小为n×n的矩阵,其中从1到n*n的每个整数恰好出现一次,找出一组排列使这个二维数组中周围每个数的差的种类最多。 投入 第一行包含一个整数t(1≤t≤49)——测试用例的数量。 每个试用例的第一行(也是唯一的一行)包含一个整数n (2≤n≤50)。
题目分析
已知一组差为最大值与最小值的差即n*n-1,因此这组数据中差的种类最多为n*n-1。如果我们要差的种类最多且加上不超过差值最大值,我们可以把差进行排序即1,-2,3,-4...,为保证加上差值后不小于1且不大于n*n,我们可以在中间取值即(n*n+1)/2,然后通过蛇形矩阵进行排序,最后输出。
代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n;
int a[60][60];
int b[5000];
cin>>n;
int t=(n*n+1)/2;
for(int i=1;i<=n*n-1;i++)
{
if(i%2==0) b[i]=-i;
else b[i]=i;
}
b[0]=t;
for(int i=1;i<=n*n-1;i++)
{
b[i]+=b[i-1];
}
int j=0;
for(int i=0;i<n;i++)//蛇形排列
{
if(i%2==0)
{
int x=i,y=0;
for(y=0;y<n;y++)
{
a[x][y]=b[j];
j++;
}
}
else
{
int x=i,y=n-1;
for(y=n-1;y>=0;y--)
{
a[x][y]=b[j];
j++;
}
}
}
for(int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int t;
cin>>t;
while (t--) solve();
return 0;
}