https://codeforces.com/contest/1118/problem/C
在查找元素的时候,必须按4,2,1的顺序进行。因为,如果先找1,可能就把原来的4拆散了,然后再找4,就找不到了
#include<bits/stdc++.h> using namespace std; int ans[25][25]; int main(){ int n; cin>>n; map<int,int> mp; int t; for(int i=0;i<n*n;i++){ cin>>t; mp[t]++; } vector<pair<int,pair<int,int> > > ceil; for(int i=0;i<(n+1)/2;i++) for(int j=0;j<(n+1)/2;j++){ if(i!=n-1-i&&j!=n-1-j) ceil.push_back({4,{i,j}}); else if(i!=n-1-i||j!=n-1-j) ceil.push_back({2,{i,j}}); else ceil.push_back({1,{i,j}}); } int number[3]={4,2,1}; for(int q=0;q<3;q++){ int w=number[q]; for(int v=0;v<ceil.size();v++){ pair<int,pair<int,int> > c=ceil[v]; int times=c.first; if(times!=w) continue; int i=c.second.first; int j=c.second.second; map<int,int>::iterator it; for(it=mp.begin();it!=mp.end();it++){ if(it->second>=times){ it->second-=times; ans[i][j] = ans[n - i - 1][j] = ans[i][n - j - 1] = ans[n - i - 1][n - j - 1] = it->first; break; } } if(it==mp.end()){ cout<<"NO"<<endl; return 0; } } } cout<<"YES"<<endl; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cout<<ans[i][j]<<" "; } cout<<endl; } return 0; }