【题目】E - Symmetric Grid

【题意】给定n*m的小写字母矩阵,求是否能通过若干行互换和列互换使得矩阵中心对称。n,m<=12。

【算法】模拟

【题解】首先行列操作独立,如果已确定行操作,那么两个在对称位置的列要满足条件必须其中一列反转后和另一列相同,或m为奇数且此列在中间。

已确定了行操作后,枚举每一列,找到它可以匹配的列直接匹配,后面如果矛盾了就直接无解(因为匹配的列都是确定的,不存在决策问题),复杂度O(nm^2)。

如何确定行操作?枚举每一行的匹配行,虽然这样理论上会枚举n^(n/2)种情况,但其中只有(n-1)!!种情况合法并进入下一过程,故复杂度为O((n-1)!!*nm^2),极限为17962560,实际上列枚举存在大量返回会更快,甚至直接枚举列匹配都能2ms AC。

代码来自:zhan8855

#include <cstdio>

char c[][],d[],e[];
int i,m,n; inline bool dfs2(int x)
{
if (x>m)
return true;
if (e[x])
return dfs2(x+);
else
{
int t=,r=;
for (int i=x;i<=m;i++)
if (! e[i])
t++;
for (int i=x;i<=m;i++)
if (! e[i])
{
e[x]=i,e[i]=x,r=;
for (int j=;j<=n;j++)
if ((c[j][x]!=c[d[j]][i]) || (c[d[j]][x]!=c[j][i]))
{
r=;
break;
}
if(i==x){
if(r&&(t&)&&dfs2(x+))return true;
}
else{
if(r){
if(dfs2(x+))return true;else return false;
}
}
/*if ((r) && ((t&1) || (i!=x)) && (dfs2(x+1)))
return true;
else if(i!=x)return false;*/
e[x]=,e[i]=;
}
}
return false;
} inline bool dfs1(int x)
{
if (x>n)
return dfs2();
if (d[x])
return dfs1(x+);
else
{
int t=;
for (int i=x;i<=n;i++)
if (! d[i])
t++;
for (int i=x;i<=n;i++)
if (! d[i])
{
d[x]=i,d[i]=x;
if (((t&) || (i!=x)) && (dfs1(x+)))
return true;
d[x]=,d[i]=;
}
}
return false;
} int main()
{
scanf("%d%d",&n,&m);
for (i=;i<=n;i++)
scanf("%s",c[i]+);
if (dfs1())
puts("YES");
else
puts("NO");
return ;
}

【AtCoder】ARC095 E - Symmetric Grid 模拟的更多相关文章

  1. 【枚举】AtCoder Regular Contest 095 C - Symmetric Grid

    题意:给你一个H*W的字符矩阵,一次操作可以任意将两行或者两列交换.问你是否能通过任意多次操作,使得其变为对称矩阵.对称的含义是:对于任何格子A(i,j),其都等于A(H-i+1,W-j+1). 显然 ...

  2. AtCoder Regular Contest 095E - Symmetric Grid

    $n \leq 12,m \leq 12$,$n$行$m$列小写字母,现可做无数次操作:交换两行:交换两列.问是否有可能把他变成中心对称的. 没有去想分组枚举的复杂度QAQ 行和列的操作顺序是随意的. ...

  3. AtCoder AGC037D Sorting a Grid (二分图匹配)

    题目链接 https://atcoder.jp/contests/agc037/tasks/agc037_d 题解 这场D题终于不像AGC032D和AGC036D一样神仙了-- 还是可做的吧 虽然考场 ...

  4. Atcoder Beginner Contest 139E(模拟,思维)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int n;int a[1007][1007] ...

  5. 2018.12.19 atcoder Iroha and a Grid(组合数学)

    传送门 组合数学好题. 给你一个hhh行www列的网格,其中左下角aaa行bbb列不能走,问从左上角走到右下角有多少种走法(每次只能向右或者向下) 我们考虑分步计数. 我们一共能走的区域是总网格区域去 ...

  6. 【AtCoder】ARC095 C-F题解

    我居然每道题都能想出来 虽然不是每道题都能写对,debug了很久/facepalm C - Many Medians 排序后前N/2个数的中位数时排序后第N/2 + 1的数 其余的中位数都是排序后第N ...

  7. AtCoder Regular Contest 095

    AtCoder Regular Contest 095 C - Many Medians 题意: 给出n个数,求出去掉第i个数之后所有数的中位数,保证n是偶数. \(n\le 200000\) 分析: ...

  8. CVPR2018: Generative Image Inpainting with Contextual Attention 论文翻译、解读

    注:博主是大四学生,翻译水平可能比不上研究人员的水平,博主会尽自己的力量为大家翻译这篇论文.翻译结果仅供参考,提供思路,翻译不足的地方博主会标注出来,请大家参照原文,请大家多多关照. 转载请务必注明出 ...

  9. [C1] 优化 C1FlexGrid 单元格边框

    一  优化理由 如下图所示,如果按照 C1FlexGrid 自带的单元格边框设置,即对每个单元格的 CellStyle 的 BorderThickness 进行设置,会得到如下图的效果: 其中,明显可 ...

随机推荐

  1. Robot Framework 教程 (1) - 环境配置及简单网站兼容性测试

    0.Robot Framework 简介 Robot Framework 是一个通用的自动化测试框架,主要用于“验收测试”和“验收测试驱动开发(ATDD)” (会其它文章中会详细介绍ATDD).它使用 ...

  2. 学习mysql触发器遇到的问题

    在 mysql.exe 下面运行的.如果是的话, 可能是需要加一个 定义 DELIMITER // 意思是告诉 mysql , 遇到 // 符号以后, 才认为语句结束了. 否则 mysql 遇到 分号 ...

  3. Linux 压缩 解压缩 命令相关

    1.命令格式:tar[必要参数][选择参数][文件] 2.命令功能:用来压缩和解压文件.tar本身不具有压缩功能.他是调用压缩功能实现的 3.命令参数:必要参数有如下:-A 新增压缩文件到已存在的压缩 ...

  4. java 数据结构与算法---树

    一.树的概念  除根节点外,其余节点有且只有一个父节点. 1.度 节点的度:每个节点的子节点个数. 树的度:树内各个节点的度的最大值. 树的高度(深度):树中节点的最大层次称为树的深度. 节点路径:一 ...

  5. DBGrid添加行号编写笔记

    procedure TForm1.ClientDataSet1NewRecord(DataSet: TDataSet); begin ShowMessage('你好'); ClientDataSet1 ...

  6. python自动化之读写

    ############################################################################# #############在Windows上 ...

  7. ognl用法 取变量时候 需要在变量前面加上# 取字符串需要用单引号包裹字符串

  8. BibTex相关

    标签(空格分隔): 杂七杂八的问题 又到了写论文的高峰期(?)在BibTeX中添加参考文献时,发现选项很多,对一些称呼还是一脸懵逼..阿一古,也许是最后一次写论文了,还弄清楚的还是清楚一下吧~ [转自 ...

  9. Atcoder Yahoo Programming Contest 2019 简要题解

    A-C 直接放代码吧. A int n,k; int main() { n=read();k=read(); puts(k<=(n+1)/2?"YES":"NO&q ...

  10. [UVALive 3902] Network

    图片加载可能有点慢,请跳过题面先看题解,谢谢 一道简单的贪心题,而且根节点已经给你了(\(S\)),这就很好做了. 显然,深度小于等于 \(k\) 的都不用管了(\(S\) 深度为0),那么我们只需要 ...