poj1222 EXTENDED LIGHTS OUT
设输入矩阵为A,输出矩阵为B,目标矩阵为C(零矩阵)。
方便起见,矩阵行列下标均从1开始。
考虑A矩阵元素a(i,j),B矩阵中与其相邻的元素 b(i,j),b(i - 1, j),b(i + 1,j),b(i,j - 1),b(i,j + 1) (#)。
有c(i,j)= 0 = a(i,j) ^ (∑ b(i,j) % 2)。
进一步有a(i,j) ^ 0 = a(i,j) = a(i,j) ^ a(i,j) ^ (∑ b(i,j) % 2) = ∑ b(i,j) % 2 (*)。
进一步考虑异或与模2加之间的关系:∑ b(i,j) % 2 = ^ B(i, j),其中B(i,j)表示(#)式5个元素的集合。
带入(*):^ B(i, j) = a(i,j)。这是我们需要的方程组。
(注:考虑边界上的元素,只需将不在矩阵范围内的b元素全部置零即可。)
将b(i,j)映射到x((i - 1) * 5 + j)(x下标从1到5 * 6)。
下面考虑解异或方程组AX= B。(与前面的表达无关)
a11 * x1 ^ a12 * x2 ^...^ a1n * xn = b1 ①
...
an1 * x1 ^ an2 * x2 ^...^ann * xn = bn ②
A,X,B均为0-1矩阵。
考虑消元,现在看系数矩阵A的第一列,若全部元素均为0,直接转到下一列,并且有方程组有多解。
若存在ai1 = 1,将其与第一行交换(这样做的目的是为了得到上三角阵)。
此时只需考虑剩余所有 1 < j ≤ n, 且aj1 = 1。有:
a11 * x1 ^ a12 * x2 ^...^ a1n * xn = b1 ①
aj1 * x1 ^ aj2 * x2 ^...^ ajn * xn = bj ②
① ^ ②:
(a11 * x1 ^ a12 * x2 ^...^ a1n * xn) ^ (aj1 * x1 ^ aj2 * x2 ^...^ ajn * xn) = b1 ^ bj。
即:(a11 * x1 ^ aj1 * x1) ^ (a12 * x2 ^ aj2 * x2) ^...^ (a1n * xn ^ ajn * xn) = b1 ^ bj 。
易于验证:a * x ^ b ^ x = (a ^ b) * x,因此进一步有:
(a11 ^ aj1)*x1 ^ (a12 ^ aj2)*x2 ^ .... ^ (a1n ^ ajn)*xn = b1 ^ bj 。
因而第j行x1的系数更新为1 ^ 1 即0 。
对增广阵如此消元至得到上三角阵即可得到答案。
http://poj.org/problem?id=1222
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxx = ;
const int maxy = ;
const int maxm = maxx * maxy;
const int maxn = maxm + ;
int A[maxn][maxn], B[maxn];
int C[maxn][maxn];
int dx[] = {, , , -, };
int dy[] = {, -, , , };
int pos(int i, int j) { return (i - ) * maxy + j; }
bool in_range(int i, int j) { return i >= && i <= maxx && j >= && j <= maxy; }
void solve(){
memset(C, , sizeof C);
for(int i = , k = ; i <= maxx; i++) for(int j = ; j <= maxy; j++, k++){
//the k-th column of the coefficient matrix
for(int u = ; u < ; u++){
int nx = i + dx[u], ny = j + dy[u], p = pos(nx, ny);
if(in_range(nx, ny)) C[k][p] = ;
}
C[k][maxm + ] = A[i][j];
}
for(int i = ; i <= maxm; i++){
//eliminate for X(i)
for(int j = i; j <= maxm; j++){
//highlighting A[j][]
if(C[j][i]){
swap(C[i], C[j]);
break;
}
}
for(int j = i + ; j <= maxm; j++){
if(!C[j][i]) continue;
for(int k = i; k <= maxm + ; k++) C[j][k] ^= C[i][k];
}
}
//retrieve the ans
for(int i = maxm; i >= ; i--){
B[i] = C[i][maxm + ];
for(int j = i + ; j <= maxm; j++) if(C[i][j]) B[i] ^= B[j];
}
for(int i = ; i <= maxx; i++){
printf("%d", B[pos(i, )]);
for(int j = ; j <= maxy; j++){
int p = pos(i, j);
printf(" %d", B[p]);
}
printf("\n");
}
} int main(){
freopen("in.txt", "r", stdin);
int T, kase = ;
scanf("%d", &T);
while(T--){
printf("PUZZLE #%d\n", ++kase);
for(int i = ; i <= maxx; i++) for(int j = ; j <= maxy; j++) scanf("%d", &A[i][j]);
solve();
}
return ;
}
poj1222 EXTENDED LIGHTS OUT的更多相关文章
- poj1222 EXTENDED LIGHTS OUT 高斯消元||枚举
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8481 Accepted: 5479 Description In an ...
- [POJ1222]EXTENDED LIGHTS OUT(高斯消元,异或方程组)
题目链接:http://poj.org/problem?id=1222 题意:开关是四连通的,每按一个就会翻转自己以及附近的四个格(假如有).问需要翻转几个,使他们都变成关. 把每一个灯看作一个未知量 ...
- [Gauss]POJ1222 EXTENDED LIGHTS OUT
题意:给一个5*6的矩阵 1代表该位置的灯亮着, 0代表该位置的灯没亮 按某个位置的开关,可以同时改变 该位置 以及 该位置上方.下方.左方.右方, 共五个位置的灯的开.关(1->0, 0-&g ...
- POJ1222 EXTENDED LIGHTS OUT 高斯消元 XOR方程组
http://poj.org/problem?id=1222 在学校oj用搜索写了一次,这次写高斯消元,haoi现场裸xor方程消元没写出来,真实zz. #include<iostream> ...
- 【高斯消元】【异或方程组】poj1222 EXTENDED LIGHTS OUT
由于每个点的状态受到其自身和周围四个点的影响,所以可以这样建立异或方程组: 引用题解: http://hi.baidu.com/ofeitian/item/9899edce6dc6d3d2974452 ...
- [poj1222]EXTENDED LIGHTS OUT(高斯消元)
题意:每个灯开启会使自身和周围的灯反转,要使全图的灯灭掉,判断灯开的位置. 解题关键:二进制高斯消元模板题. 复杂度:$O({n^3})$ #include<cstdio> #includ ...
- EXTENDED LIGHTS OUT poj1222 高斯消元法
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6443 Accepted: 42 ...
- POJ 1222 EXTENDED LIGHTS OUT(翻转+二维开关问题)
POJ 1222 EXTENDED LIGHTS OUT 今天真是完美的一天,这是我在poj上的100A,留个纪念,马上就要期中考试了,可能后面几周刷题就没这么快了,不管怎样,为下一个200A奋斗, ...
- uva 1560 - Extended Lights Out(枚举 | 高斯消元)
题目链接:uva 1560 - Extended Lights Out 题目大意:给定一个5∗6的矩阵,每一个位置上有一个灯和开关,初始矩阵表示灯的亮暗情况,假设按了这个位置的开关,将会导致周围包含自 ...
随机推荐
- 改变对update的做法
以前都是 先根据id或者其他条件查出来 再根据查出来的结果 进行修改 再update提交 这里可以改所有的字段 现在是做法 是直接new 一个 Do或者Vo 把要改变的值 先填充进去 然后再去 ...
- Swift实战-豆瓣电台(九)简单手势控制暂停播放(全文完)
Swift实战-豆瓣电台(九)简单手势控制暂停播放 全屏清晰观看地址:http://www.tudou.com/programs/view/tANnovvxR8U/ 这节我们主要讲UITapGestu ...
- Java基础(8):方法重载的4个依据与例子
判断方法重载的依据: 1. 必须是在同一个类中 2. 方法名相同 3. 方法参数的个数.顺序或类型不同 4. 与方法的修饰符或返回值没有关系 运行结果:
- C++之路进阶——codevs1036(商务旅行)
1036 商务旅行 题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇 ...
- linux环境变量与本地变量
两者不同的是. 环境变量可以在shell的子进程中使用, 而本地变量不同. 每当连接上服务器时,服务器就会通过帐号密码运行一个SHELL,我们所做的工作都在这个SHELL上,特殊方法除外(如,守护进程 ...
- 夺命雷公狗ThinkPHP项目之----企业网站25之网站前台面包屑导航URL的完善
如果想取出面包屑导航的url那么就必须在model层里面进行多取一个了: <?php namespace Home\Model; use Think\Model; class CategoryM ...
- json转化为java实体
import net.sf.json.JSONObject; Map<String, Object> classMap = new HashMap<String, Object> ...
- 在linux中的virtualbox无法挂载usb设备的解决方法
方法来源于网络. 在安装完virtualbox之后,virtualbox会建立一个名为 vboxusers 的组,将你的用户名加入到该组即可. 命令参考: #usermod -a -G vboxuse ...
- MFC 进度条控件
1.进度条 主要用来进行数据读写.文件拷贝和磁盘格式等操作时的工作进度提示情况,如安装程序等,伴随工作进度的进展,进度条的矩形区域从左到右利用当前活动窗口标题条的颜色来不断填充. 2.进度条控制在MF ...
- Objective-C代码的文件扩展名与数据类型
Objective-C数据类型可以分为:基本数据类型.对象类型和id类型. 基本数据类型有:int.float.double和char类型. 对象类型就是类或协议所声明的指针类型,例如:SAutore ...