• 题意:给你\(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. MBAir下安装httprunner2.5.7 har2case 出现zsh: command not found解决方案

    MBAir下python3.8安装httprunner2.5.7 出现zsh: command not found find / -name hrun查找到路径为: /Users/w550856/Li ...

  2. MySQL 使用MD5对数据进行加密

    数据库MD5加密 -- ================ 测试 MD5 加密 ============== CREATE TABLE `testmd5`( id INT(11) NOT NULL AU ...

  3. 【Linux】reverse mapping checking getaddrinfo for XXX.XXXX.com failed - POSSIBLE BREAKIN ATTEMPT!

    ------------------------------------------------------------------------------------------------- | ...

  4. CTF实验吧-WEB题目解题笔记(1)简单的登陆题

    1.简单的登陆题 解题链接: http://ctf5.shiyanbar.com/web/jiandan/index.php  Burp抓包解密 乱码,更换思路.尝试id intruder 似乎也没什 ...

  5. Numpy的一些学习记录

    Numpy的一些记录 产生numpy.array的方式 import numpy as np arr1 = np.array([1, 2, 3]) print(arr1) arr2 = np.zero ...

  6. Jmeter的Cookie管理器调试与参数化

     默认系统都是需要登录,才能操作其它接口,所以需要添加一个HTTP Cookie 管理器,默认Cookie管理器是关闭的,需要修改jmeter配置文件jmeter.properties,该文件在jme ...

  7. 为什么 TCP 协议有粘包问题

    为什么 TCP 协议有粘包问题 这部分转载自draveness博客. TCP/IP 协议簇建立了互联网中通信协议的概念模型,该协议簇中的两个主要协议就是 TCP 和 IP 协议.TCP/ IP 协议簇 ...

  8. Java SPI机制详解

    Java SPI机制详解 1.什么是SPI? SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制.SPI是一种动态替换发现的机制, 比如有个 ...

  9. Java并发组件二之CyclicBarriar

    使用场景: 多个线程相互等待,直到都满足条件之后,才能执行后续的操作.CyclicBarrier描述的是各个线程之间相互等待的关系. 使用步骤: 正常实例化:CyclicBarrier sCyclic ...

  10. 通过 profiling 定位 golang 性能问题 - 内存篇 原创 张威虎 滴滴技术 2019-08-02

    通过 profiling 定位 golang 性能问题 - 内存篇 原创 张威虎 滴滴技术 2019-08-02