bzoj4171 or 省队集训day3 chess: Rhl的游戏
2024-10-12 18:07:14
【题目描述】
RHL最近迷上一个小游戏:Flip it。游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色。每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少与该格子有一条公共边的格子),黑变白,白变黑。
RHL希望把所有格子都变成白色的。不幸的是,有一些格子坏掉了,无法被按下。这时,它可以完成游戏吗?
【输入格式】
第一行一个整数T,表示T组数据。
每组数据开始于三个整数n,m,k,分别表示格子的高度和宽度、坏掉格子的个数。接下来的n行,每行一个长度m的字符串,表示格子状态为’B’或‘W’。最后k行,每行两个整数Xi,Yi(1≤Xi≤n,1≤Yi≤m),表示坏掉的格子。
【输出格式】
对于每组数据,先输出一行Case #i: (1≤i≤T)
如果可以成功,输出YES,否则输出NO。
【样例输入】
2
3 3 0
WBW
BBB
WBW
3 3 2
WBW
BBB
WBW
2 2
3 2
【样例输出】
Case #1:
YES
Case #2:
NO
【数据范围】
30%,n,m,k<=10
100%,n,m,k<=256,T<=10
http://www.cnblogs.com/chenyushuo/p/4685182.html
和这个类似的设个xor方程组,对于不能按的方块,直接将它定为0即可
code:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 260
using namespace std;
char ch,s[maxn];
int T,n,m,N,M,k,x,y;
unsigned int c[maxn][maxn][maxn>>],a[maxn<<][maxn>>];
bool col[maxn][maxn],ok,d[maxn][maxn],b[maxn<<];
inline void read(int &x){
for (ok=,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=;
for (x=;isdigit(ch);x=x*+ch-'',ch=getchar());
if (ok) x=-x;
}
bool gauss(){
int i,j,k,p,q;
for (i=,k=;i<N;i++){
for (p=(<<(i&)),j=k;j<=M&&!(a[j][i>>]&p);j++);
if (j<=M){
for (q=(i>>);q<=((N-)>>);q++) swap(a[k][q],a[j][q]);
swap(b[k],b[j]);
for (j=j+;j<=M;j++)
if (a[j][i>>]&p){
for (q=(i>>);q<=((N-)>>);q++) a[j][q]^=a[k][q];
b[j]^=b[k];
}
k++;
}
}
for (;k<=M;k++) if (b[k]) return false;
return true;
}
int main(){
read(T);
for (int t=;t<=T;t++){
read(m),read(n),read(k),N=n,M=n;
for (int i=;i<=m;i++){
scanf("%s",s+);
for (int j=;j<=n;j++) col[i][j]=(s[j]=='B');
}
for (int i=;i<=n;i++) c[][i][(i-)>>]=(<<((i-)&));
for (int i=;i<=m;i++)
for (int j=;j<=n;j++){
for (int k=;k<=((n-)>>);k++)
c[i][j][k]=c[i-][j-][k]^c[i-][j][k]^c[i-][j+][k]^c[i-][j][k];
d[i][j]=d[i-][j-]^d[i-][j]^d[i-][j+]^d[i-][j]^col[i-][j];
}
for (int i=;i<=n;i++){
for (int j=;j<=((n-)>>);j++)
a[i][j]=c[m][i][j]^c[m][i-][j]^c[m][i+][j]^c[m-][i][j];
b[i]=col[m][i]^d[m][i-]^d[m][i]^d[m][i+]^d[m-][i];
}
while (k--){
read(x),read(y),++M;
for (int i=;i<=((n-)>>);i++) a[M][i]=c[x][y][i];
b[M]=d[x][y];
}
printf("Case #%d:\n",t);
if (gauss()) puts("YES");
else puts("NO");
}
return ;
}
最新文章
- CSS实现垂直居中的5种方法
- phpize 扩展GD库 安装 ! 环境--centos 7 +nginx 1.7.11+php 5.6.7
- c/c++面试题(6)运算符重载详解
- VB已死?还是会在Roslyn之下焕发新生?
- [saiku] 优化多维度查询效率
- 琐碎的总结 css jQuery js 等等。。。
- js处理日期的一些整理(js获取给定日期前一天的日期)
- Ext Grid 加载超时设置timeout: 180000
- SQL按日期Datatime来比较大小
- C#中的委托和游戏中的运用
- CTreeCtrl 控件使用总结
- 微信小程序之----底部菜单action-sheet
- 2017总结&;2018展望
- Python中’__main__’模块的作用
- 从一张图开始,谈一谈.NET Core和前后端技术的演进之路
- 类与对象 &;&; 继承
- 常用的JSP内置对象(1)
- python之路--BOM和DOM
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- 稳聘App设计图分享
热门文章
- 《ACM国际大学生程序设计竞赛题解I》——6.10
- 如何高性能的给UIImageView加个圆角
- Cstyle的UEFI导读之SEC第一篇 Reset Vector
- 《Java 并发编程实战》读书笔记之二:图文讲述同步的另一个重要功能:内存可见性
- Appium服务器端从启动到case完成的活动分析
- linux常用命令 http://mirrors.163.com/ubuntu-releases/12.04/
- TI C66x DSP 系统events及其应用 - 5.10(创建ISR的三种情况)
- python中的TCP编程学习
- android studio c++ 自动补全
- getopt 分析命令行参数 -n -t 1