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