• 题意:给你\(n\)个数,判断是否能构成一个\(n\)X\(n\)的回文矩阵,若可以,输出\(YES\)和矩阵,否则输出\(NO\).

  • 题解:如果这个矩阵的行/列元素是偶数的话,很好办,所有出现的数一定是\(4\)的倍数,我们直接判断然后模拟输出一下即可.如果是奇数,就要麻烦一点,我们首先用桶存一下所有元素的出现次数,然后直接模拟,首先奇数矩阵的左上右上左下右下一定是对称的,所以我们可以先看左上角的一个小块,模拟一下,每次可以确定\(4\)个位置.之后就是两行中心线了,除了中心,每个位置的元素的对应位置只有一个,所以判断\(2\)即可,再最后是否剩下一个元素给中心即可.

  • 代码:

    int n;
    int a[N];
    map<int,int> mp;
    int g[200][200];
    bool st[200][200];
    int one; int main() {
    //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    n=read();
    for(int i=1;i<=n*n;++i){
    a[i]=read();
    mp[a[i]]++;
    } if(n%2==0){
    bool flag=true;
    for(auto w:mp){
    if(w.se%4!=0){
    flag=false;
    break;
    }
    }
    if(!flag) cout<<"NO"<<endl;
    else{
    cout<<"YES"<<endl;
    for(auto &w:mp){
    for(int i=1;i<=n;++i){
    bool flag=true;
    for(int j=1;j<=n;++j){
    if(!st[i][j]){
    g[i][j]=w.fi,st[i][j]=true;
    g[i][n+1-j]=w.fi,st[i][n+1-j]=true;
    g[n+1-i][j]=w.fi,st[n+1-j][j]=true;
    g[n+1-i][n+1-j]=w.fi,st[n+1-i][n+1-j]=true;
    w.se-=4;
    if(w.se==0){
    flag=false;
    break;
    }
    }
    }
    if(!flag) break;
    }
    }
    for(int i=1;i<=n;++i){
    for(int j=1;j<=n;++j){
    cout<<g[i][j]<<" ";
    }
    cout<<'\n';
    }
    }
    }
    else{
    int cnt=0;
    for(int i=1;i<=n/2;++i){
    for(int j=1;j<=n/2;++j){
    for(auto &w:mp){
    if(w.se>=4){
    g[i][j]=w.fi;
    g[i][n+1-j]=w.fi;
    g[n+1-i][j]=w.fi;
    g[n+1-i][n+1-j]=w.fi;
    w.se-=4;
    cnt++;
    break;
    }
    }
    }
    }
    if(cnt!=(n/2)*(n/2)){
    cout<<"NO"<<endl;
    return 0;
    }
    int row=(n/2)+1;
    cnt=0;
    for(int j=1;j<=n/2;++j){
    for(auto &w:mp){
    if(w.se>=2){
    g[row][j]=w.fi;
    g[row][n+1-j]=w.fi;
    cnt++;
    w.se-=2;
    break;
    }
    }
    }
    if(cnt!=n/2){
    cout<<"NO"<<endl;
    return 0;
    }
    int col=row;
    cnt=0;
    for(int i=1;i<=n/2;++i){
    for(auto &w:mp){
    if(w.se>=2){
    g[i][col]=w.fi;
    g[n+1-i][col]=w.fi;
    cnt++;
    w.se-=2;
    break;
    }
    }
    }
    if(cnt!=(n/2)){
    cout<<"NO"<<endl;
    return 0;
    }
    for(auto &w:mp){
    if(w.se==1){
    g[row][col]=w.fi;
    cout<<"YES"<<endl;
    for(int i=1;i<=n;++i){
    for(int j=1;j<=n;++j){
    cout<<g[i][j]<<" ";
    }
    cout<<'\n';
    }
    return 0;
    }
    }
    cout<<"NO"<<endl;
    } return 0;
    }

Codeforces Round #540 (Div. 3) C. Palindromic Matrix (大模拟)的更多相关文章

  1. Codeforces Round #540 (Div. 3) C. Palindromic Matrix 【暴力】

    任意门:http://codeforces.com/contest/1118/problem/C C. Palindromic Matrix time limit per test 2 seconds ...

  2. Codeforces Round #540 (Div. 3)--1118C - Palindromic Matrix

    https://codeforces.com/contest/1118/problem/C 在查找元素的时候,必须按4,2,1的顺序进行.因为,如果先找1,可能就把原来的4拆散了,然后再找4,就找不到 ...

  3. Codeforces Round #540 (Div. 3) 部分题解

    Codeforces Round #540 (Div. 3) 题目链接:https://codeforces.com/contest/1118 题目太多啦,解释题意都花很多时间...还有事情要做,就选 ...

  4. 二分查找/暴力 Codeforces Round #166 (Div. 2) B. Prime Matrix

    题目传送门 /* 二分查找/暴力:先埃氏筛选预处理,然后暴力对于每一行每一列的不是素数的二分查找最近的素数,更新最小值 */ #include <cstdio> #include < ...

  5. Codeforces Round #367 (Div. 2) B. Interesting drink (模拟)

    Interesting drink 题目链接: http://codeforces.com/contest/706/problem/B Description Vasiliy likes to res ...

  6. Codeforces Round #540 (Div. 3) A,B,C,D2,E,F1

    A. Water Buying 链接:http://codeforces.com/contest/1118/problem/A 实现代码: #include<bits/stdc++.h> ...

  7. Codeforces Round #531 (Div. 3) F. Elongated Matrix(状压DP)

    F. Elongated Matrix 题目链接:https://codeforces.com/contest/1102/problem/F 题意: 给出一个n*m的矩阵,现在可以随意交换任意的两行, ...

  8. Codeforces Round #540 (Div. 3)--1118F1 - Tree Cutting (Easy Version)

    https://codeforces.com/contest/1118/problem/F1 #include<bits/stdc++.h> using namespace std; in ...

  9. Codeforces Round #540 (Div. 3)--1118D2 - Coffee and Coursework (Hard Version)

    https://codeforces.com/contest/1118/problem/D2 和easy version的主要区别是,数据增加了. easy version采用的是线性查找,效率低 在 ...

随机推荐

  1. Ubuntu_Gedit配置

    Ubuntu_Gedit配置 为了换Ubuntu的时候能够更加方便,不用再用手重新打一遍代码,丢几个Gedit配置-- External Tools gdb compile (F2) #!/bin/s ...

  2. linux线程数限制与zabbix监控

    Linux最大线程数限制及当前线程数查询 最大线程数计算方式: n = total_memory/128k; Linux用户线程数限制而导致的程序异常为 java.lang.OutOfMemoryEr ...

  3. xtrabackup 备份与恢复

    书上摘抄 ---深入浅出mysql 448页  grant reload on *.* to 'backup'@'localhost' identified by '123456'; grant re ...

  4. python—打开图像文件报错

    今天使用python打开一张图像文件的时候报错了 UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illeg ...

  5. Kubernetes CoreDNS 状态是 CrashLoopBackOff 报错

    查看状态的时候,遇见coredns出现crashlookbackoff,首先我们来进行排错,不管是什么原因,查看coredns的详细信息,以及logs [root@k8s-master coredns ...

  6. 如何使用github搜索需要的开源项目

    按照项目名/仓库名搜索(大小写不敏感)in:name xxx按照README搜索(大小写不敏感)in:readme xxx按照description搜索(大小写不敏感)in:description x ...

  7. 关于BAPI_TRANSACTION_COMMIT一点说明

    我们调用bapi做了相关的业务操作后,通常都要在后面调用 BAPI_TRANSACTION_COMMIT来提交所做得更改 然而,有时候,在程序中需要调用多个不同的BAPI实现不同的功能,那么这个时候就 ...

  8. 5V充12.6V三节锂电池,5V升压12.6V的电路图

    三串锂电池的充电电压是三串锂电池的最高电压值,就是12.6V了.5V充12.6V是5V给三串锂电池充电.如笔记本的USB口5V给三串锂电池充电,如5V的适配器或者手机充电器插上数据线给三串锂电池充电电 ...

  9. Bitter.Core系列四:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 之 示例 查询

    一: 单表模型驱动查询 如下示例代码演示: // 根据ID 查询: var studentquery = db.FindQuery<TStudentInfo>().QueryById(12 ...

  10. How does Go kit compare to Micro?

    Go kit - Frequently asked questions https://gokit.io/faq/ How does Go kit compare to Micro? Like Go ...