题意:给你n*n个数,让你构造一个n*n的回文矩阵。如果没答案输出NO。
思路:暴力构造一下,奇数填中间。代码稍长一些。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int m[1005][1005];int a[1005];
int vis[1005];
int main()
{
int n;cin>>n;
for(int i=1;i<=n*n;i++) cin>>a[i];
for(int i=1;i<=n*n;i++) vis[a[i]]++;
int f=0;
for(int i=1;i<=1000;i++)
{
if(vis[i]%2==1)
{
if(f) {cout<<"NO\n";return 0;
}
else {
f=i;
}
}
}
if(f)
{
if(n%2==0)
{
cout<<"NO\n";return 0;
}
else
{
int num1=0,num2=0;int b1[1005];int b2[1005];
m[(n+1)/2][(n+1)/2]=f;vis[f]--;
for(int i=1;i<=1000;i++)
{
if(vis[i]>=4)
{
for(int j=0;j<vis[i]/4;j++)
b1[num1++]=i;
vis[i]%=4;
}
if(vis[i]%4==0)
{
if(vis[i]!=0)
{
for(int j=0;j<vis[i]/4;j++)
b1[num1++]=i;
}
}
else if(vis[i]%2==0)
{
if(vis[i]!=0)
{
for(int j=0;j<vis[i]/2;j++)
b2[num2++]=i;
}
}
else
{
cout<<"NO\n";return 0;
}
}
/*for(int i=0;i<num1;i++) printf("-%d ",b1[i]);printf("\n");
for(int i=0;i<num2;i++) printf("%d ",b2[i]);*/
if(num2>n-1)
{
cout<<"NO\n";return 0;
}
while(num2!=n-1)
{
b2[num2++]=b1[num1-1];
b2[num2++]=b1[num1-1];num1--;
}
int p=0;
for(int i=1;i<=(n)/2;i++)
{
for(int j=1;j<=(n)/2;j++)
{
if(i==(n+1)/2&&j==(n+1)/2) continue;
else
m[i][j]=b1[p++];
}
}
p=0;
for(int i=1;i<=n/2;i++)
{
m[i][(n+1)/2]=b2[p++];
m[(n+1)/2][i]=b2[p++];
}
for(int i=1;i<=(n+1)/2;i++)
{
for(int j=1;j<=(n+1)/2;j++)
{
if(i==(n+1)/2&&j==(n+1)/2) continue;
m[i][n-j+1]=m[i][j];
m[n-i+1][j]=m[i][j];
m[n-i+1][n-j+1]=m[i][j];
}
}
printf("YES\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)printf("%d ",m[i][j]);
printf("\n");
}
}
}
else
{
if(n%2==1)
{
cout<<"NO\n";return 0;
}
else
{
int num=0;int b[1005];
for(int i=1;i<=1000;i++)
{
if(vis[i]%4==0)
{
if(vis[i]!=0)
{
for(int j=0;j<vis[i]/4;j++)
b[num++]=i;
}
}
else
{
cout<<"NO\n";return 0;
}
}
/*for(int i=0;i<num1;i++) printf("-%d ",b1[i]);printf("\n");
for(int i=0;i<num2;i++) printf("%d ",b2[i]);*/
int p=0;
for(int i=1;i<=n/2;i++)
{
for(int j=1;j<=n/2;j++)
{
m[i][j]=b[p++];
}
}
for(int i=1;i<=(n)/2;i++)
{
for(int j=1;j<=(n)/2;j++)
{
m[i][n-j+1]=m[i][j];
m[n-i+1][j]=m[i][j];
m[n-i+1][n-j+1]=m[i][j];
}
}
printf("YES\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)printf("%d ",m[i][j]);
printf("\n");
}
}
}
return 0;
}