Educational Codeforces Round 141:B. Matrix of Differences

一、来源:Problem - B - Codeforces

二、题面

image-20230129132127881

三、思路

  1. 我们先从一维思考如何构造尽可能多的数值差。以n=2为例,此时有1,2,3,4数,其中构成差值为3的方案有一个1,4,构成差值为2的方案有两个1,3/2,4,同理构成差值为1的方案有三个1,2/2,3/3,4.

  2. 由此可见我们应该先构造较大的数,故可得序列1,4,2,3,2,3,1,4。观察第一个序列我们可以发现其规律在于后\(n^2/2\)项逆序插入,将该规则扩展到更大的n依然适用

  3. 由于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;
}
posted @ 2023-02-05 16:19  Arno_vc  阅读(19)  评论(0编辑  收藏  举报