hihocoder 1196 高斯消元.二
描述
在上一回中,小Hi和小Ho趁着便利店打折,买了一大堆零食。当他们结账后,看到便利店门口还有其他的活动。
店主:买了东西还可以参加游戏活动哦,如果能够完成游戏还有额外的奖品。
小Hi和小Ho赶紧凑了过去。
店主放了一块游戏板在店门口,有5行6列格子。左上角为坐标(1,1)。一部分格子是亮着的,另一部分是暗着的。

当按下某一个格子时,它和上下左右4个格子的状态就会改变。原来亮着的格子变成暗的,原来暗的格子会变亮。比如下图中按下标记有红叉的格子后,绿色虚线区域内的格子状态都会改变:

店主给出初始的状态,参加游戏的人员需要通过按下某些格子,让游戏板上所有的灯都亮起来就可以赢得奖品。
小Ho:这不就是开关灯问题么,看我来解决它!
本题改编自ACMICPC Greater New York 2002 EXTENDED LIGHTS OUT
输入
第1..5行:1个长度为6的字符串,表示该行的格子状态,1表示该格子是亮着的,0表示该格子是暗的。
保证一定存在解,且一定存在暗着的格子。
输出
需要按下的格子数量k,表示按下这k个位置后就可以将整个游戏板所有的格子都点亮。
接下来k行,每行一个坐标(x,y),表示需要按下格子(x,y)。x坐标较小的先输出,若x相同,则先输出y坐标较小的。
样例输入
001111
011111
111111
111110
111100
样例输出
2
1 1
5 6
- ---------------------------------------------------------------
- 异或方程组的形式为
- a[0][0]*x[0] ^ a[0][1]*x[1] ^ ... ^ a[0][n-1]*x[n-1] = a[0][n]
- a[1][0]*x[0] ^ a[1][1]*x[1] ^ ... ^ a[1][n-1]*x[n-1] = a[1][n]
- .
- .
- a[n-1][0]*x[0] ^ a[n-1][1]*x[1] ^ ... ^ a[n-1][n-1]*x[n-1] = a[n-1][n]
- 方程组中所有量都是bool量
- ----------------------------------------------------------------
- 比较异或方程组和一般的线性方程组,不难发现:
- 除了所有加号(+)都换成了异或(^)外,形式上两者是完全一致的
- 因而对于异或方程组,我们考虑是否可用类似于高斯消元解线性方程组的方法来解。
- 这就是说我们希望通过行变换将系数矩阵转化成单位矩阵。
- 对此我们有下述结论可用:
- ----------------------------------------------------------------------------------------
- 若
- a[0]*x[0] ^ a[1]*x[1] ^ ... ^ a[n-1]*x[n-1] = A
- b[0]*x[0] ^ b[1]*x[1] ^ ... ^ b[n-1]*x[n-1] = B
- 则
- (a[0]^b[0])*x[0] ^ (a[1]^b[1])*x[1] ^ ... ^ (a[n-1]^b[n-1])*x[n-1] = A ^ B
- -----------------------------------------------------------------------------------------
- 实际上我们只要证明
- a*x ^ b*x = (a ^ b)*x
- 上述结论便是很自然的推论了
- 而由于这里涉及的所有量都是bool值,只要枚举便能证明。
- 我们也可以从另一角度来看:
- 异或运算相当于模2下的加法运算,即
- a ^ b = (a + b) % 2
- 我们有
- (a*x + b*x) % 2
- = ((a+b)*x) % 2
- = ((a+b) % 2) * (x % 2) % 2
- 在 a, b, x都是bool量的情况下
- 上式即
- a*x ^ b*x = (a ^ b)*x
- 这样异或(^)与加法(+)两种运算便自然联系起来了,异或方程组与一般的线性方程组本质上没有区别。
- --------------------------------------------------------------------------------------------------------
- 异或方程组的高斯消元过程同样是:
- 枚举行,对第i行,在第i列选主元交换到第i行。将其余该列为1的行,用第i行与之异或。
- --------------------------------------------------------------------------------------------------------
#include <bits/stdc++.h>
using namespace std;
char s[][];
int a[][];
int dx[]={, , , , -};
int dy[]={, , -, , };
int ok(int x, int y){
return x>=&&x<&&y>=&&y<;
}
int swap(int i, int j){
int tmp[];
memcpy(tmp, a[i], sizeof(tmp));
memcpy(a[i], a[j], sizeof(tmp));
memcpy(a[j], tmp, sizeof(tmp));
} int gauss(int n){
for(int i=; i<n; i++){
for(int j=i; j<n; j++)
if(a[j][i]){
swap(i, j);
break;
}
for(int j=; j<n; j++)
if(j!=i&&a[j][i]){
//消去第j行第i项
for(int k=i; k<=n; k++)
a[j][k]^=a[i][k];
}
//output();
}
} int main(){
for(int i=; i<; i++)
cin>>s[i];
for(int i=; i<; i++)
for(int j=; j<; j++){
int now=*i+j;
for(int k=; k<; k++){
int x=i+dx[k], y=j+dy[k];
if(ok(x, y)){
int nei=*x+y;
a[now][nei]=;
}
}
a[now][]=(s[i][j]-'')^;
}
gauss();
int ans=;
for(int i=; i<; i++)
ans+=a[i][];
cout<<ans<<endl;
for(int i=; i<; i++)
if(a[i][])
cout<<i/+<<' '<<i%+<<endl;
}
hihocoder 1196 高斯消元.二的更多相关文章
- hihoCoder 1196 高斯消元·二
Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...
- hihoCoder#1196 : 高斯消元·二(开关灯问题)
传送门 高斯消元解异或方程组 小Ho在游戏板上忙碌了30分钟,任然没有办法完成,于是他只好求助于小Hi. 小Ho:小Hi,这次又该怎么办呢? 小Hi:让我们来分析一下吧. 首先对于每一个格子的状态,可 ...
- 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"的高斯 ...
随机推荐
- Ember模板中的操作指向
模板中的链接操作指向有三个地方,该模板对应的控制器和路由以及视图,默认是先跳转到控制器,如果控制器里没有定义模板中动作的方法,就去该模板对应的路由里找,如果还没找到,就去父级路由找,直到顶级路由,如果 ...
- Pureftp-安全的ftp服务器部署
一.简介: Pure-FTPd 是一款免费(BSD)的,安全的,高质量和符合标准的FTP服务器. 侧重于运行效率和易用性. 它提供了简单的答案,他满足了大众化的需求,包括普通用户以及主机供应商们 Pu ...
- 使用c#创建php可以调用的dll
1. 创建一个 C# Class Library ,命名为:ClassLibraryDemo 2. 打开项目的属性,在点选左边的 “Application”(就是第一个tab) , 然后点击 Asse ...
- 【转】【C#】【Thread】Mutex 互斥锁
Mutex:互斥(体) 又称同步基元. 当创建一个应用程序类时,将同时创建一个系统范围内的命名的Mutex对象.这个互斥元在整个操作系统中都是可见的.当已经存在一个同名的互斥元时,构造函数将会输出一个 ...
- freemarker语法简介
ftl是一种模板标记语言,用于渲染数据,输入html结构.语法简介如下: ${book.name} ${book.name?if_exists} //值是否存在 ${book.name??} //值是 ...
- activiti-explorer:使用mysql导入外部bpmn文件后存在乱码的问题
我已经采取了如下步骤,但是仍然还是乱码 1. 在mysql中创建数据库时指定使用utf8编码: CREATE DATABASE Activiti DEFAULT CHARACTER SET utf8 ...
- jQuery.smoove — jQuery和CSS3炫酷滚动页面内容元素动画特效插件
插件介绍: jQuery-smoove是一款jQuery和CSS3炫酷滚动页面内容元素动画特效插件.该内容元素动画插件在页面滚动到指定位置时,该位置的HTML元素会执行指定的CSS3动画特效,如旋转. ...
- 导航栏全透明效果, 只保留左右两个按钮, 如何实现?以及关于NavigationController的小问题
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor clearCo ...
- 常用的user32API说明
整理了一下常用的user32API说明 还有软件Microsoft Spy++供大家下载 Spyv10.00.30319.rar using System; using System.Collect ...
- ORA-00911: 无效字符
思路:遇到这样问题首先第一步:将有误sql粘至数据库运行一下,如果报错,说明sql存在问题. 第二步:数据库没问题.那么就要想你的书写方式是否正确,是否是ibatasi里的写法,或许是多了个 : 或 ...