codeforce 1118C Palindromic Matrix(模拟)

题意:给你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;
}
发布了155 篇原创文章 · 获赞 32 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_37632935/article/details/87879315
今日推荐