4171: Rhl的游戏

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 74  Solved: 33
[Submit][Status][Discuss]

Description

RHL最近迷上一个小游戏:Flip it。游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色
。每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少与该格子有一条公共边的格子
),黑变白,白变黑。RHL希望把所有格子都变成白色的。不幸的是,有一些格子坏掉了,无法被按下。这时,它
可以完成游戏吗?

Input

第一行一个整数T,表示T组数据。
每组数据开始于三个整数n,m,k,分别表示格子的高度和宽度、坏掉格子的个数。接下来的n行,每行一个长度m的
字符串,表示格子状态为'B'或'W'。最后k行,每行两个整数Xi,Yi(1≤Xi≤n,1≤Yi≤m),表示坏掉的格子。
n,m,k<=256,T<=10

Output

对于每组数据,先输出一行Case #i: (1≤i≤T)
如果可以成功,输出YES,否则输出NO。

Sample Input

2
3 3 0
WBW
BBB
WBW
3 3 2
WBW
BBB
WBW
2 2
3 2

Sample Output

Case #1:
YES
Case #2:
NO

HINT

Source

【分析】

  今天脑子真的不好,这种题既知道思路也不会打。。还要膜奥爷爷给我理思路了。。

  首先,显然是高斯消元。但当然不是每个格子都是未知量。其实只要枚举第一行,就能推出全部。

  $f[i][j]$是bitset表示的点$(i,j)$的状态,他们的异或和表示$(i,j)$这个点按还是不按。

  第一行$f[1][j]=(0,0,...1,0,0,...)$,只有第$j$位为1。

  当$(i,j)$初始为$B$,$a[i][j]=1$,否则$a[i][j]=0$。

  举个栗子:$nw$表示$(2,1)$这个点按还是不按,那么$nw$^$x1$^$x2$=$a[1][1]$ → $nw$=$x1$^$x2$^$a[1][1]$

  每个点都可以用第一行的$x$和$a$数组表示出来,写成$f[i][j]$即$f[2][1]=(1,1,0,0,0,0,...,a[1][1])$ 【这就是奥爷爷举的例子啦,想了一会我终于懂了

  【有时候真的不要太纠结这个是个什么方程什么的,就表示你想表示的东西就好了,毕竟异或还是很通用,很多种理解方式都可以使用高斯消元的

  常数的异或和放在$m+1$位。、

  对于损坏点$(x,y)$即 $f[x][y][1]$^$f[x][y][2]$^...$f[x][y][m+1]$=0,则$f[x][y][1]$^...$f[x][y][m]$=$f[x][y][m+1] $,看成是$m$个元的方程。

  对于最后一行,我们前面没有保证他的值是对的,所以要列$m$个方程,

  $f[n][j]$^$f[n][j-1]$ ^$f[n][j+1]$ ^$f[n-1][j]$=$a[n][j]$ 也把$m+1$项弄到右边去和$a[n][j]$异或得到新的方程。

  高斯消元判断是否有解就好了。

  注意每次求$f[i][j]$的时候是保证$(i-1,j)$这个点的状态正确。

  放弃了抄代码,终于开始自己想,自己打的时候,终于AC了。。

  事实证明,理解别人的东西还是困难的,还是要自己多多想啊!!

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bitset>
using namespace std;
#define Maxn 310 char s[Maxn];
int a[Maxn][Maxn];
bitset<Maxn > f[Maxn][Maxn],w[*Maxn];
int n,m,k; bool solve()
{
for(int j=;j<=m;j++)
{
for(int i=;i<=n;i++) f[][j][i]=;
f[][j][j]=;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
f[i][j]=f[i-][j]^f[i-][j];
if(j>) f[i][j]^=f[i-][j-];
if(j<m) f[i][j]^=f[i-][j+];
f[i][j][m+]=f[i][j][m+]^a[i-][j];
}
int cnt=;
for(int i=;i<=k;i++)
{
int x,y;
scanf("%d%d",&x,&y);
w[++cnt]=f[x][y];
}
w[++cnt]=f[n][]^f[n][]^f[n-][];
w[cnt][m+]=w[cnt][m+]^a[n][];
for(int j=;j<m;j++) w[++cnt]=f[n][j-]^f[n][j]^f[n][j+]^f[n-][j],w[cnt][m+]=w[cnt][m+]^a[n][j];
w[++cnt]=f[n][m-]^f[n][m]^f[n-][m];w[cnt][m+]=w[cnt][m+]^a[n][m];
int i=;
for(int j=;j<=m;j++)
{
int t=;
for(int k=i;k<=cnt;k++) if(w[k][j]) {t=k;break;}
if(!t) continue;
swap(w[i],w[t]);
for(int k=i+;k<=cnt;k++) if(w[k][j]) w[k]^=w[i];
i++;
}
bool ok=;
for(int i=;i<=cnt;i++)
{
bool p=;
for(int j=;j<=m;j++) if(w[i][j]!=) {p=;break;}
if(p&&w[i][m+]) return ;
}
return ;
} int main()
{
int T,kase=;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++)
{
scanf("%s",s+);
for(int j=;j<=m;j++)
{
if(s[j]=='B') a[i][j]=;
else a[i][j]=;
}
}
printf("Case #%d:\n",++kase);
if(solve()) printf("YES\n");
else printf("NO\n");
}
return ;
}

2017-04-10 22:15:50

【BZOJ 4171】 4171: Rhl的游戏 (高斯消元)的更多相关文章

  1. BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]

    以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高 ...

  2. [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)

    [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...

  3. BZOJ 2466 中山市选2009 树 高斯消元+暴力

    题目大意:树上拉灯游戏 高斯消元解异或方程组,对于全部的自由元暴力2^n枚举状态,代入计算 这做法真是一点也不优雅... #include <cstdio> #include <cs ...

  4. [Sdoi2017]硬币游戏 [高斯消元 KMP]

    [Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...

  5. 【bzoj3105】[cqoi2013]新Nim游戏 高斯消元求线性基

    题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从 ...

  6. BZOJ 1923 外星千足虫(高斯消元)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1923 题意:有n个数字,m次测试.每个数字为0或者1.每次测试选出一些数字出来把他们加起 ...

  7. BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )

    数据范围太大不能直接高斯消元, tarjan缩点然后按拓扑逆序对每个强连通分量高斯消元就可以了. E(u) = 1 + Σ E(v) / degree(u) 对拍时发现网上2个程序的INF判断和我不一 ...

  8. BZOJ 2337: [HNOI2011]XOR和路径( 高斯消元 )

    一位一位考虑异或结果, f(x)表示x->n异或值为1的概率, 列出式子然后高斯消元就行了 --------------------------------------------------- ...

  9. BZOJ 1770: [Usaco2009 Nov]lights 燈( 高斯消元 )

    高斯消元解xor方程组...暴搜自由元+最优性剪枝 -------------------------------------------------------------------------- ...

  10. BZOJ 2466: [中山市选2009]树( 高斯消元 )

    高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...

随机推荐

  1. 2D旋转和3D旋转

    2D旋转 先给个容器 <p onClick="rotate2D()" id="rotate2D" class="animated_div&quo ...

  2. GridControl详解(八)菜单

    菜单控件 拖入窗口中 显示如下 设置popupMenu 设置barManager 设置controller 增加菜单项 弹出配置窗口 一般菜单项设置 对应属性如下: 对应事件: 选择菜单项设置 事件同 ...

  3. 引用类型 ( 对象定义 )——Object 类型

    本文地址:http://www.cnblogs.com/veinyin/p/7607100.html  创建实例 new 操作符后跟构造函数 var people = new Object(); pe ...

  4. wampserver 虚拟主机

    转载:http://blog.csdn.net/knight_quan/article/details/51830683 1.背景: 在进行网站开发的时候,通常需要以http://localhost或 ...

  5. webpack编译报错:Module not found: Error: Cannot resolve 'file' or 'directory' ./../../node_modules..

    在同事的mac电脑上,可以正常编译,拿到我这边就出错了(⊙﹏⊙) 好像是webpack在window下的一个bug,需要让 webpack 和你的项目保持在一个盘符下,参考. 解决方法: 修改conf ...

  6. [网站安全] [实战分享]WEB漏洞挖掘的一些经验分享

    WEB漏洞有很多种,比如SQL注入,比如XSS,比如文件包含,比如越权访问查看,比如目录遍历等等等等,漏洞带来的危害有很多,信息泄露,文件上传到GETSHELL,一直到内网渗透,这里我想分享的最主要的 ...

  7. python算法之近似熵、互近似熵算法

    理论基础 近似熵? 定义:近似熵是一个随机复杂度,反应序列相邻的m个点所连成折线段的模式的互相近似的概率与由m+1个点所连成的折线段的模式相互近似的概率之差. 作用:用来描述复杂系统的不规则性,越是不 ...

  8. Ubuntu 17.10 安装 “爱壁纸” 时,缺失了 python-support 依赖

    Ubuntu 17.10 安装 "爱壁纸" 的 deb 包时,缺失了 python-support 依赖.使用  sudo apt-get -f install 也没修复.查了下官 ...

  9. java之正则表达式、日期操作

    正则表达式和日期操作 正则表达式简介 正则表达式就是使用一系列预定义的特殊字符来描述一个字符串的格式规则,然后使用该格式规则匹配某个字符串是否符合格式要求. 作用:比如注册邮箱,邮箱有用户名和密码,一 ...

  10. HTML 禁止显示input默认提示信息

    看问题 html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...