我们先来分析他的一般条件,如果有K个数字那么我们出现最多的差值情况是多少呢?
答案是k-1种,那么如果按照题目中的要求来看,我们有没有一种可能让n*n-1种差值都出现呢?
为了达成这个目的,我们很容易想到最大最小交错放的情况。
1,n*n,2,n*n-1,3....
显然通过这种情况我们就可以尽可能多的找出最多的差值情况。
那么我们该如何表示呢?毕竟,我们只有这样一条链,很容易发现,只要我们能够让这种关系出现在矩阵种,那么这时就是最优解。
1 9 2 8 3 7 4 6 5
1 9 2
7 3 8
4 6 5
学习get点:
一字长蛇阵法,利用奇偶性来判断一个位置应该放哪个数字,当然之前还有一种f标识法实现插空放置。
转化矩阵:我们发现当为偶数行时。。。。(最关键的就是注意观察)
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int a[2500];
int b[60][60];
for(int i=1;i<=n*n;i++)
{
if(i%2==1)a[i]=(i/2)+1;
else a[i]=n*n-(i/2)+1;
}
int sum=0;
for(int i=1;i<=n;i++)
{
if(i%2==1)
for(int j=1;j<=n;j++)
{
++sum;
b[i][j]=a[sum];
}
else
for(int j=n;j>=1;j--)
{
++sum;
b[i][j]=a[sum];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
}
return 0;
}