noi.ac #536 打地鼠
题目链接:戳我
【问题描述】
小A在玩打地鼠游戏。有一个n×m的网格,每个位置上地鼠都会要么冒出头要么缩进去。地鼠很狡猾,每次小A选一个地鼠冒出头的格子(x,y)把它打下去,但同一行同一列的地鼠全都会冒出头来。
小A发现这个游戏好像怎么都玩不完。这个时候小B过来向他展示真正的技术了。小B当然也知道这游戏是玩不完的,于是他准备了两个状态,并准备向小A表演把状态1进行若干次打地鼠操作变成状态2。
现在小B想知道他会不会翻车。
【输入格式】
第一行两个整数n,m表示棋盘大小n行m列。
接下来n行,每行一个长为m的字符串描述初始状态,'O'表示地鼠冒出头来,'X'表示地鼠缩了进去。
接下来n行,每行一个长为m的字符串描述结束状态,格式同上。
【输出格式】
如果能从初始状态变成目标状态输出1,否则输出0。
【样例输入】
4 4
XOOO
XXXX
XOOX
XOXO
OXOO
XOOO
XOOO
OOOO
【样例输出】
1
【数据规模】
subtask1(20'):n,m≤4。
subtask2(30'):n,m≤50。
subtask3(50'):n,m≤1000。
用黑色表示缩下去,白色表示冒出头。
每次操作相当于选一个白的变成黑的,但这行这列都会变成白的。
考虑倒着做。用灰色表示可能是黑也可能是白。
那么操作就变成了:选一个黑色或灰色的,必须满足这行这列除了它没有黑色,把它变成白色并把这行这列变成灰色。
注意到要操作一个黑色时,这行这列除了它就没有黑色了,所以操作之间不会干扰,直接能做就做就行了。
最后判下灰色的行列的交界处必须至少有一个白色(要进行第一步操作)。其它位置必须对应相等。
还要特判下如果一开始两个状态就相等输出1。
复杂度O(nm)。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#define mp make_pair
#define MAXN 1010
using namespace std;
int n,m;
int a[MAXN][MAXN],b[MAXN][MAXN],cnt_hang[MAXN],cnt_lie[MAXN];
int done[MAXN][MAXN],done_hang[MAXN],done_lie[MAXN];
char s[MAXN][MAXN],t[MAXN][MAXN];
queue<pair<int,int> >q;
//倒着做 相当于把0变成1 QAQ
inline bool check_the_same()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]!=b[i][j]) return false;
return true;
}
inline bool check_s()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]!=0) return false;
return true;
}
inline bool check_t()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(b[i][j]!=1) return false;
return true;
}
inline void paint(int x,int y)
{
if(!done_hang[x])
{
done_hang[x]=1;
for(int j=1;j<=m;j++)
{
if(j==y) continue;
b[x][j]=-1;
if(!cnt_lie[j]) q.push(mp(x,j));
}
}
if(!done_lie[y])
{
done_lie[y]=1;
for(int i=1;i<=n;i++)
{
if(i==x) continue;
b[i][y]=-1;
if(!cnt_hang[i]) q.push(mp(i,y));
}
}
}
inline bool solve()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(b[i][j]==0&&cnt_hang[i]==1&&cnt_lie[j]==1)
{
q.push(mp(i,j));
b[i][j]=-1;
done[i][j]=1;
}
while(!q.empty())
{
int u_x=q.front().first;
int u_y=q.front().second;
q.pop();
paint(u_x,u_y);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(b[i][j]!=-1&&a[i][j]!=b[i][j])
return false;
return true;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(s[i][j]=='O') a[i][j]=1;
else a[i][j]=0;
}
for(int i=1;i<=n;i++) scanf("%s",t[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(t[i][j]=='O') b[i][j]=1;
else b[i][j]=0,cnt_hang[i]++,cnt_lie[j]++;
}
if(check_the_same()) printf("1\n");
else if(check_s()||check_t()) printf("0\n");
else if(solve()) printf("1\n");
else printf("0\n");
return 0;
}
noi.ac #536 打地鼠的更多相关文章
- # NOI.AC省选赛 第五场T1 子集,与&最大值
NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...
- NOI.ac #31 MST DP、哈希
题目传送门:http://noi.ac/problem/31 一道思路好题考虑模拟$Kruskal$的加边方式,然后能够发现非最小生成树边只能在一个已经由边权更小的边连成的连通块中,而树边一定会让两个 ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- NOI.AC NOIP模拟赛 第二场 补记
NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- NOI.AC NOIP模拟赛 第四场 补记
NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- NOI.AC WC模拟赛
4C(容斥) http://noi.ac/contest/56/problem/25 同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形). 问题变 ...
随机推荐
- pycharm虚拟环境的搭建
目录 优点 windows 安装 配置虚拟环境管理器工作目录 MacOS.Linux 安装 工作文件 配置 使用 pycharm使用 新建项目 添加环境 使用环境 优点 1.使不同应用开发环境相互独立 ...
- url编码问题小计
昨天通过get访问服务器遇到了服务器获取不到参数的问题,最后排查下来是因为url编码的原因,之前使用的是字符串拼接,所以有一些特殊字符如‘%’没有正确的编码, 通过改成各个部分编码,正确获取到数据. ...
- JS基础_条件运算符
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Python算法题(二)——国际象棋棋盘(排列组合问题,最小的K个数)
题目一(输出国际象棋棋盘) 分析: 用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格. 主要代码: for i in range(8): for j in range(8 ...
- vim insert VISUAL模式无法右键复制问题(转)
转自:https://blog.csdn.net/coder_oyang/article/details/89096219 vim中使用鼠标右键粘贴,失败.vim的模式: 网上解法: 1. 普通模式下 ...
- 微信小程序返回箭头跳转到指定页面
onUnload: function () { wx.reLaunch({ url: '../me/order-detail', }) },//这里url搞相对路径 wx.reLaunch跳到新页面没 ...
- vue 项目中如何在页面刷新的状态下保留数据
1.问题:在vue项目中,刷新页面之后,我当前打开的所有菜单,都消失,我如何实现刷新之后页面仍然是刷新之前的状态 效果图: 解决方法: 使用vuex作状态管理: 将vuex里面的数据同步更新到loca ...
- 前端imageBuffer设置图片src(后端返回二进制流图片)
参考地址1:前端imageBuffer设置图片src(后端到前端直传buffer) 参考地址2:axios根据流生成图片 本质为buffer转base64 // 获取项目截图 getItemPic() ...
- linux 删除文件空间未释放问题
现象:我们测试环境上,导出数据文件时,由于作业报错,重复导出,空间使用到达100%,按理说,导出的文件时在相同的路径下,文件名也是一致的,会自动替换. 那么之前导出的文件会被删除,问题就出现在删除这一 ...
- 关于同一台服务器上两个PHP项目相互访问超时的问题
当一台服务器部署多个PHP项目,各自运行时并无干扰, 即使都使用 9000端口来跑php 但是有一种情况,当其中一个项目需要调用另一个php项目的接口时,便会超时,这是因为php是单线程的同步的 也许 ...