hihoCoder#1196 : 高斯消元·二(开关灯问题)
高斯消元解异或方程组
小Ho在游戏板上忙碌了30分钟,任然没有办法完成,于是他只好求助于小Hi。
小Ho:小Hi,这次又该怎么办呢?
小Hi:让我们来分析一下吧。
首先对于每一个格子的状态,可能会对它造成影响的是其自身和周围4个格子,这五个格子被按下的总次数也就等于该格子所改变的总次数。
对于任意一个格子,如果这个格子改变了偶数次状态,则等价于没有发生改变。
我们可以将1看作格子亮着,0看作格子暗着,每改变1次就加1,最后格子的状态等于其总数值 MOD 2。
则其运算结果刚好满足异或运算,即每改变一次等于状态值 xor 1。
同样的对于一个格子和它周围的4个格子来说,若格子被按下偶数次,它自身和周围4个格子的状态也等于没有发生改变。所以我们可以知道:任意一个格子至多被按下一次。
假设有数组x[1..30],分别表示这30个格子是否按下1次,若按下则x[i]=1,否则x[i]=0。
则对于1个格子,他最后的状态为:
当前状态 = 初始状态 xor (a[1] * x[1]) xor (a[2] * x[2]) xor ... xor (a[30] * x[30])
其中a[i]表示格子i是否会对当前格子产生影响,若能够则a[i] = 1,否则a[i] = 0
对方程进行变换有:
(a[1] * x[1]) xor (a[2] * x[2]) xor ... xor (a[30] * x[30]) = 当前状态 xor 初始状态
因为我们的目标是要让所有等格子都为亮的状态,故我们需要让 当前状态 = 1,则:
(a[1] * x[1]) xor (a[2] * x[2]) xor ... xor (a[30] * x[30]) = 1 xor 初始状态
不妨设y = 1 xor 初始状态:
(a[1] * x[1]) xor (a[2] * x[2]) xor ... xor (a[30] * x[30]) = y
对于所有的格子,我们可以连立出方程组:
(a[ 1][1] * x[1]) xor (a[ 1][2] * x[2]) xor ... xor (a[ 1][30] * x[30]) = y[ 1]
(a[ 2][1] * x[1]) xor (a[ 2][2] * x[2]) xor ... xor (a[ 2][30] * x[30]) = y[ 2]
...
(a[30][1] * x[1]) xor (a[30][2] * x[2]) xor ... xor (a[30][30] * x[30]) = y[30]
到此,我们的目标就是求出一个x[1..30],使得上面的方程组成立。
小Ho:这个看上去和高斯消元很像啊。
小Hi:没错,这个方程组叫异或方程组,它可以用和高斯消元同样的方法来解决。
其解答过程几乎和高斯消元无异,判定无解和多解的方式也相同。唯一需要注意的是消元过程不再是高斯消元的加减,而是通过xor运算来进行消元。比如消除第j行第i列的1:
a[j][k] = a[j][k] xor a[i][k], y[j] = y[j] xor y[i]
其原理是:
(a[j][1] * x[1]) xor (a[j][2] * x[2]) xor ... xor (a[j][30] * x[30]) xor (a[i][1] * x[1]) xor (a[i][2] * x[2]) xor ... xor (a[ i][30] * x[30]) = y[j] xor y[i]
<=> ((a[j][1] * x[1]) xor (a[i][1] * x[1])) xor (((a[j][2] * x[2]) xor (a[i][2] * x[2]))) xor ... xor ((a[j][30] * x[30]) xor (a[i][30] * x[30])) = y[j] xor y[i]<=> ((a[j][1] xor a[i][1]) * x[1]) xor ((a[j][2] xor a[i][2]) * x[2]) xor ... ((a[j][30] xor a[i][30]) * x[30]) = y[j] xor y[i]
而且由于给定游戏板是固定的,我们可以知道a[i][j]矩阵一定是固定的,而且通过计算可以知道我们消元得到的上三角矩阵也是固定的,并且在这一次的问题中该上三角矩阵是满秩的,所以其一定存在唯一解。
所以我们一定有办法完成这个游戏。
小Ho:我明白了,我这就去写程序,这奖品我拿定了!
#include <cmath>
#include <cstdio>
#include <iostream>
#define N 35
#define D(x, y) (((x) - 1) * 6 + (y)) using namespace std; int ans;
int a[N][N];
char s[N][N]; inline void Guass()
{
int i, j, k, t;
for(j = 1; j <= 30; j++)
{
t = j;
for(i = j; i <= 30; i++)
if(a[i][j] > a[t][j])
t = i;
if(t != j) swap(a[t], a[j]);
for(i = j + 1; i <= 30; i++)
if(a[i][j])
for(k = j; k <= 31; k++)
a[i][k] ^= a[j][k];
}
for(i = 30; i >= 1; i--)
{
for(j = i + 1; j <= 30; j++)
a[i][31] ^= (a[i][j] * a[j][31]);
if(a[i][31]) ans++;
}
} int main()
{
int i, j;
for(i = 1; i <= 5; i++)
{
scanf("%s", s[i] + 1);
for(j = 1; j <= 6; j++)
{
a[D(i, j)][D(i, j)] = 1;
a[D(i, j)][31] = 1 ^ (s[i][j] - '0');
if(1 < i && i <= 5) a[D(i - 1, j)][D(i, j)] = a[D(i, j)][D(i - 1, j)] = 1;
if(1 <= i && i < 5) a[D(i + 1, j)][D(i, j)] = a[D(i, j)][D(i + 1, j)] = 1;
if(1 < j && j <= 6) a[D(i, j - 1)][D(i, j)] = a[D(i, j)][D(i, j - 1)] = 1;
if(1 <= j && j < 6) a[D(i, j + 1)][D(i, j)] = a[D(i, j)][D(i, j + 1)] = 1;
}
}
Guass();
printf("%d\n", ans);
for(i = 1; i <= 5; i++)
for(j = 1; j <= 6; j++)
if(a[D(i, j)][31])
printf("%d %d\n", i, j);
return 0;
}
hihoCoder#1196 : 高斯消元·二(开关灯问题)的更多相关文章
- hihocoder 1196 高斯消元.二
传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中,小Hi和小Ho趁着便利店打折,买了一大堆零食.当他们结账后,看到便利店门口还有其他的活动. 店主:买了 ...
- hihoCoder 1196 高斯消元·二
Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...
- hiho #1196 : 高斯消元·二
#1196 : 高斯消元·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中,小Hi和小Ho趁着便利店打折,买了一大堆零食.当他们结账后,看到便利店门口还有其 ...
- hihocoder 第五十二周 高斯消元·二【高斯消元解异或方程 难点【模板】】
题目地址:http://hihocoder.com/contest/hiho57/problem/1 输入 第1..5行:1个长度为6的字符串,表示该行的格子状态,1表示该格子是亮着的,0表示该格子是 ...
- HihoCoder 1195 高斯消元·一(高斯消元)
题意 https://hihocoder.com/problemset/problem/1195 思路 高斯消元是解决高元方程的一种算法,复杂度 \(O(n^3)\) . 过程大致是: 构造一个未知数 ...
- hihoCoder 1195 高斯消元.一
传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:喂不得了啦,那边便利店的薯片半价了! 小Hi:啥?! 小Ho:那边的便利店在打折促销啊. 小Hi:走走走, ...
- hihoCoder #1195 高斯消元·一
题意:便利店老板为了促销,推出了组合包的形式,将不同数量的各类商品打包成一个组合.比如2袋薯片,1听可乐的组合只要5元,而1袋薯片,2听可乐的组合只要4元.通过询问老板知道:一共有N种不同的商品和M种 ...
- [HIHO1196]高斯消元·二(高斯消元、枚举自由变元)
题目链接:http://hihocoder.com/problemset/problem/1196 #include <bits/stdc++.h> using namespace std ...
- [hihoCoder] 高斯消元·一 [TPLY]
高斯消元一 题目链接 : http://hihocoder.com/problemset/problem/1195?sid=1269842 很"好aoaoaoaoaoaoa"的高斯 ...
随机推荐
- Node.Js的Module System 以及一些常用 Module
Node.Js学习就按照这本书的流程来. 在第7章结束与第10章结束时分别自己出一个小项目练练手.Node.Js的入门学习计划是这样. 目录:, QQ:1045642972 欢迎来索书以及讨论Node ...
- AJPFX浅谈Java 性能优化之字符串过滤实战
★一个简单的需求 首先描述一下需求:给定一个 String 对象,过滤掉除了数字(字符'0'到'9')以外的其它字符.要求时间开销尽可能小.过滤函数的原型如下: String filter(Strin ...
- Springboot + Websocket + Sockjs + Stomp + Vue + Iview 实现java后端日志显示在前端web页面上
话不多说,看代码. 一.pom.xml 引入spring boot websocket依赖 <dependency> <groupId>org.springframework. ...
- 开启apahce的mod_speling.so模块,让使用apahce http服务器不再有大小写烦恼
今天把服务器重新安装系统,做apache调优前,优化下apache对网络地址大小写不区分的支持.记录如下: 编译mod_speling.so模块去除Apache-url大小写字母敏感的配置 1. 进入 ...
- Selenium私房菜系列3 -- Selenium API参考手册【ZZ】
大家在编写测试案例想查阅Selenium API说明时,可以查阅本文,否则请跳过! (注:这里API版本比较老,新版本的Selenium的API在这里不一定能找到.) Selenium API说明文档 ...
- react基础语法(三)组件的创建和复合组件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- CATransaction 知识
CATransaction 事务类,可以对多个layer的属性同时进行修改.它分隐式事务,和显式事务. 区分隐式动画和隐式事务:隐式动画通过隐式事务实现动画 . 区分显式动画和显式事务:显式动画有多种 ...
- TCP/IP详解之IP协议
1.IP协议 IP协议是TCP/IP协议的核心,所有的TCP,UDP,IMCP,IGCP的数据都以IP数据格式传输.要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制 ...
- 应用程序员眼中的数据库管理系统:API+数据库语言
应用程序员眼中的数据库管理系统:API+数据库语言 sqlite3_open_v2 https://www.cnblogs.com/cchust/p/5121559.html
- 网新恩普(W 笔试)
选择题 1.一桶有黄色,绿色,红色三种,闭上眼睛抓取同种颜色的两个.抓取多少个就可以确定你肯定有两个同一颜色的球? 答案: 4次 1.最坏打算抓3次都是不同颜色的黄.绿.红,此时,三种颜色的球各抓了一 ...