[CCPC 2024 Shandong I] 矩阵题解

题目描述

构造一个 n 行 n 列的矩阵,满足以下所有条件:

  • 矩阵的元素是从 1 到 2n 的整数(含两端)。
  • 每个从 1 到 2n 的整数(含两端)在矩阵里至少出现一次。
  • 令 ai,j​ 表示第 i 行第 j 列的元素,恰有一个整数四元组 (x,y,z,w) 满足:
    • 1≤x<z≤n。
    • 1≤y<w≤n。
    • ax,y​,ax,w​,az,y​,az,w​ 互不相同。

输入格式

每个测试文件仅有一组测试数据。

第一行输入一个整数 n(2≤n≤50)表示矩阵的大小。

输出格式

如果可以构造出这样的矩阵,首先输出一行 Yes。接下来输出 n 行,其中第 i 行输出 n 个由单个空格分隔的整数 ai,1​,ai,2​,⋯,ai,n​(1≤ai,j​≤2n),其中 ai,j​ 表示矩阵第 i 行第 j 列的元素。如果有多种合法答案,您可以输出任意一种。

如果无法构造出这样的矩阵,只需要输出一行 No。

输入输出样例

输入 #1复制

2

输出 #1复制

Yes
1 2
3 4

输入 #2复制

3

输出 #2复制

Yes
3 2 6
4 3 3
3 1 5

思路

首先在四个角输出1234,然后上下相同,中间每行相同,如:

1 5 6 7 2

8 8 8 8 8

9 9 9 9 9

10 10 10 10 10

3 5 6 7 4

即可。

代码见下

#include<bits/stdc++.h>
using namespace std;
long long n,cc=0,f[55][55];
int main(){
    cin>>n;
    cout<<"Yes"<<endl;
    f[1][1]=1;
    f[1][n]=2;
    f[n][1]=3;
    f[n][n]=4;
    cc=4;
    if(n==2){
        cout<<"1 2\n3 4\n"<<endl;
        return 0;
    }
    for(int i=2;i<=n-1;i++){
        f[1][i]=5;
        f[n][i]=5;
    }
    for(int i=2;i<=n-1;i++){
        if(cc==2*n){
            f[1][i]=f[n][i]=cc;
        }
        else{
            f[1][i]=f[n][i]=++cc;
        }
    }
    for(int i=2;i<=n-1;i++){
        if(cc!=2*n) cc++;
        for(int j=1;j<=n;j++){
            f[i][j]=cc;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cout<<f[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

posted @ 2025-10-17 19:57  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源