• 题意:给你\(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. 三十二:WEB漏洞-文件操作之文件下载读取全解

    文件下载读取 原路,检测,利用,修复 利用 数据库配置文件下载或者读取后续 接口密钥信息文件下载或者读取后续 文件名,参数值,目录符号 read.xxx?filename= down.xxx?file ...

  2. JAVA中@Override的含义

    @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1.可以当注释用,方便阅读: 2.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.例 ...

  3. ReactRouter的实现

    ReactRouter的实现 ReactRouter是React的核心组件,主要是作为React的路由管理器,保持UI与URL同步,其拥有简单的API与强大的功能例如代码缓冲加载.动态路由匹配.以及建 ...

  4. uni-app开发经验分享十八:对接第三方h5

    1.uni-app中对接第三方为了防止跳出app使用了webview <template> <view> <web-view :src="url" @ ...

  5. DNS是如何工作的?

    今天很多人都在讲域名系统和互联网作为一个整体是如何工作的,域名系统---也就是大家所熟知的DNS.不幸的是,对于天龙人和普通人来说,他们并不了解DNS到底是什么鬼.今天就来聊聊DNS,和那些想了解DN ...

  6. vue-cli快速创建项目,可视化创建

    之前学习了交互式创建,发现过程无聊,而且不方便,后面又学习了图形可视化创建,下面进行分享 1.打开cmd 2.输入vue ui,输入后会出现如下 C:\Users\12235>vue ui St ...

  7. XA Transactions

    XA Transactions XA is a two-phase commit protocol that is natively supported by many databases and t ...

  8. Python的交互模式和直接运行.py文件有什么区别

    使用文本编辑器 - 廖雪峰的官方网站 https://www.liaoxuefeng.com/wiki/1016959663602400/1017024645952992 直接输入python进入交互 ...

  9. Java Socket InetAddress类 Socket DatagramPacket TCP、UDP示例

    java.net :为实现网络应用程序提供类. InetAddress类 方法摘要 方法摘要 boolean equals(Object obj) : 将此对象与指定对象比较. byte[] getA ...

  10. Docker Desktop启动Kubernetes

    Docker_Desktop启动Kubernetes 参考仓库:https://github.com/AliyunContainerService/k8s-for-docker-desktop 视频参 ...