Educational Codeforces Round 141:B. Matrix of Differences
一、来源:Problem - B - Codeforces
二、题面
三、思路
-
我们先从一维思考如何构造尽可能多的数值差。以n=2为例,此时有1,2,3,4数,其中构成差值为3的方案有一个1,4,构成差值为2的方案有两个1,3/2,4,同理构成差值为1的方案有三个1,2/2,3/3,4.
-
由此可见我们应该先构造较大的数,故可得序列
1,4,2,3
,2,3,1,4
。观察第一个序列我们可以发现其规律在于后\(n^2/2\)项逆序插入,将该规则扩展到更大的n依然适用 -
由于side-adjacent elements既可以是上下,也可以是左右,我们可以通过原序列构建矩阵
1(→) 4(↓) 2 2(←)
四、代码
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=55;
int mp[N][N];
int main(){
int n;
cin >> n;
while(n--){
int m;
cin >> m;
int num=1;
for(int i=1;i<=m;i++){
if(i%2==1){
for(int j=1;j<=m;j++){
mp[i][j]=num%2==1?(num+1)/2:(m*m-(num-1)/2);
num++;
}
}else{
for(int j=m;j>=1;j--){
mp[i][j]=num%2==1?(num+1)/2:(m*m-(num-1)/2);
num++;
}
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
printf("%d%c",mp[i][j],j!=m?' ':'\n');
}
}
}
return 0;
}