• 题意:给你\(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. 映泰主板H100系列安装win7的各种坑

    自100系列主板发布以来,windows7好像就被遗弃一样,原因就在于安装win7的时候,会出现USB设备无法使用导致无法安装的问题.主要在于Win7系统没有整合USB的XHCI驱动,而100系列芯片 ...

  2. 一文告诉你Java日期时间API到底有多烂

    前言 你好,我是A哥(YourBatman). 好看的代码,千篇一律!难看的代码,卧槽卧槽~其实没有什么代码是"史上最烂"的,要有也只有"史上更烂". 日期是商 ...

  3. 给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息。

    1 import java.text.SimpleDateFormat; 2 import org.apache.hadoop.fs.*; 3 4 public class E_RecursiveRe ...

  4. python_3 装饰器参数之谜

    装饰器参数之谜 之前已经初步了解过装饰器了,知道了装饰器可以"偷梁换柱",在不改变函数的调用方式和函数内容的时候,而把函数的功能偷偷地修改. 那么问题来了,如果被修改的函数中有参数 ...

  5. (转载)微软数据挖掘算法:Microsoft 目录篇

    本系列文章主要是涉及内容为微软商业智能(BI)中一系列数据挖掘算法的总结,其中涵盖各个算法的特点.应用场景.准确性验证以及结果预测操作等,所采用的案例数据库为微软的官方数据仓库案例(Adventure ...

  6. Springboot中PropertySource注解的使用

    https://blog.csdn.net/qq_30739519/article/list/3 注解 https://blog.csdn.net/qq_30739519/article/detail ...

  7. DDD领域驱动设计:仓储

    1 前置阅读 在阅读本文章之前,你可以先阅读: 什么是DDD DDD的实体.值对象.聚合根的基类和接口:设计与实现 2 什么是仓储? 仓储封装了基础设施来提供查询和持久化聚合操作. 它们集中提供常见的 ...

  8. 系列trick - bitmask

    目录 系列trick - bitmask 拆位 位运算优化(点少的)图操作 位筛 系列trick - bitmask 拆位 主体思想:位之间不影响,把每一位拆开来考虑贡献,转化成非常容易考虑的 0/1 ...

  9. LOJ10069 TREE

    题目描述 原题来自:2012 年国家集训队互测 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need 条白色边的生成树.题目保证有解. 输入格式 第一行 V,E,need 分 ...

  10. LOJ10104Blockade

    POI 2008 Byteotia 城市有 n 个城镇,m 条双向道路.每条道路连接两个不同的城镇,没有重复的道路,所有城镇连通.输出 n 个数,代表如果把第i  个点去掉,将有多少对点不能互通. 输 ...