CodeForces - 1118C Palindromic Matrix 构造 优先队列

Let's call some square matrix with integer values in its cells palindromic if it doesn't change after the order of rows is reversed and it doesn't change after the order of columns is reversed.

For example, the following matrices are palindromic:

The following matrices are not palindromic because they change after the order of rows is reversed:

The following matrices are not palindromic because they change after the order of columns is reversed:

You are given n2n2 integers. Put them into a matrix of nn rows and nn columns so that each number is used exactly once, each cell contains exactly one number and the resulting matrix is palindromic. If there are multiple answers, print any. If there is no solution, print "NO".

Input

The first line contains one integer nn (1≤n≤201≤n≤20).

The second line contains n2n2 integers a1,a2,…,an2a1,a2,…,an2 (1≤ai≤10001≤ai≤1000) — the numbers to put into a matrix of nn rows and nn columns.

Output

If it is possible to put all of the n2n2 numbers into a matrix of nn rows and nncolumns so that each number is used exactly once, each cell contains exactly one number and the resulting matrix is palindromic, then print "YES". Then print nn lines with nn space-separated numbers — the resulting matrix.

If it's impossible to construct any matrix, then print "NO".

You can print each letter in any case (upper or lower). For example, "YeS", "no" and "yES" are all acceptable.

Examples

Input

4
1 8 8 1 2 2 2 2 2 2 2 2 1 8 8 1

Output

YES
1 2 2 1
8 2 2 8
8 2 2 8
1 2 2 1

Input

3
1 1 1 1 1 3 3 3 3

Output

YES
1 3 1
3 1 3
1 3 1

Input

4
1 2 1 9 8 4 3 8 8 3 4 8 9 2 1 1

Output

NO

Input

1
10

Output

YES
10 

题意:构造出中心对称的矩阵

题解:我们只要需要枚举(1,1)-(n/2,n/2),其他三部分对应一样即可,这样就要满足需要的数的数量是大于等于4的,然后就是n是奇数的时候,只需要满足中竖线上下对称,中横线左右对称即可,需要的数的数量需要大于等于2,最后剩余的最后一个数放在中心即可,处理过程中数量若有不满足,即不符合条件

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1100][1100],an[1010];
int n;
struct node{
	int x,sum;
	bool operator <(const node &xx)const
	{
		return sum<xx.sum;
	}
};
int main()
{
	int x;
	cin>>n;
	for(int i=1;i<=n*n;i++)
	{
		cin>>x;
		an[x]++;
	}
	priority_queue<node> q;
	node tmp;
	for(int i=1;i<=1000;i++)
	{
		
		if(an[i])
		{
		//	cout<<an[i]<<endl;
			tmp.sum=an[i];
			tmp.x=i;
			q.push(tmp);	
		}
	}
	for(int i=1;i<=n/2;i++)
	{
		for(int j=1;j<=n/2;j++)
		{
			tmp=q.top();q.pop();
		//	cout<<now.sum<<" "<<tmp.x<<endl;
			if(tmp.sum<4)
			{
				cout<<"NO\n";
				return 0;
			}
			a[i][j]=a[i][n-j+1]=a[n-i+1][j]=a[n-i+1][n-j+1]=tmp.x;
			tmp.sum=tmp.sum-4;
			if(tmp.sum>0)
			{
				q.push(tmp);
			}
		}
	}
	if(n&1)
	{
		int j=n/2+1;
		for(int i=1;i<=n/2;i++)
		{
			node now=q.top();q.pop();
			if(now.sum<2)
			{
				cout<<"NO\n";
				return 0;
			}
			a[i][j]=a[n-i+1][j]=now.x;
			now.sum-=2;
			if(now.sum)
			{
				q.push(now);
			}
		}
		
		for(int i=1;i<=n/2;i++)
		{
			node now=q.top();q.pop();
			if(now.sum<2)
			{
				cout<<"NO\n";
				return 0;
			}
			a[j][i]=a[j][n-i+1]=now.x;
			now.sum-=2;
			if(tmp.sum)
			{
				q.push(now);
			}
		}
		node now=q.top();q.pop();
		a[n/2+1][n/2+1]=now.x;
		
	}
	cout<<"YES\n";
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			printf("%d%c",a[i][j]," \n"[j==n]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/mmk27_word/article/details/87909118