[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;
}

浙公网安备 33010602011771号