poj1222(高斯消元法解异或方程组+开关问题)
题目链接:https://vjudge.net/problem/POJ-1222
题意:给定一个5×6的01矩阵,改变一个点的状态时它上下左右包括它自己的状态都会翻转,因为翻转2次等价与没有翻转,那么每个点要么不翻转,要么翻转一次,求最终要怎样翻转可以使得矩阵全0。
思路:
做法1(枚举): 因为数据小,可以枚举第一行的所有可能,共1<<6种,之后的每一行都根据上一行决定,然后通过判断最后一行是否满足条件来判断这种方案是否可行。
做法2(高斯消元法): 为了说的清楚,现在假定矩阵为2×3,比如为
,现在要达到的目标状态是:
现在要求6个灯的状态,相当于6个变量。另外有6个方程,分别表示6个点最终的状态。
比如,对于第0个灯,能影响到它的就是第0、1、3盏灯,因此它的方程是: (1*x0) ^ (1*x1) ^ (0*x2) ^ (1*x3) ^ (0*x4) ^ (0*x5) =0,(式子右边的0表示第0盏灯最开始的状态)。
同理第1盏灯的方程即为:(1*x0) ^ (1*x1) ^ (1*x2) ^ (0*x3) ^ (1*x4) ^ (0*x5) =1。
因此可以列出6个方程,然后用高斯消元法来求解,异或方程组的处理和普通线性方程组是一样的。
对于题目就是5×6=30个方程,30个变量分别表示30盏灯的状态。
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std; const int maxn=;
int T,cas,a[maxn][maxn],ans[maxn]; void init(){
memset(a,,sizeof(a));
memset(ans,,sizeof(ans));
for(int i=;i<;++i){
for(int j=;j<;++j){
int t=i*+j;
a[t][t]=;
if(i>) a[t][t-]=;
if(i<) a[t][t+]=;
if(j>) a[t][t-]=;
if(j<) a[t][t+]=;
}
}
} void Gauss(int equ,int var){
int r=,c=;
for(;r<equ&&c<var;++r,++c){
int Maxr=r;
for(int i=r+;i<equ;++i)
if(abs(a[i][c])>abs(a[Maxr][c]))
Maxr=i;
if(a[Maxr][c]==){
--r;
continue;
}
if(Maxr!=r){
for(int i=c;i<=var;++i)
swap(a[r][i],a[Maxr][i]);
}
for(int i=r+;i<equ;++i){
if(a[i][c]==) continue;
for(int j=c;j<=var;++j)
a[i][j]^=a[r][j];
}
}
for(int i=var-;i>=;--i){
ans[i]=a[i][var];
for(int j=i+;j<equ;++j)
ans[i]^=(a[i][j]&ans[j]);
}
} int main(){
scanf("%d",&T);
while(T--){
init();
for(int i=;i<;++i)
scanf("%d",&a[i][]);
Gauss(,);
printf("PUZZLE #%d\n",++cas);
for(int i=;i<;++i){
for(int j=;j<;++j){
printf("%d",ans[i*+j]);
if(j!=) printf(" ");
}
printf("\n");
}
}
return ;
}
poj1222(高斯消元法解异或方程组+开关问题)的更多相关文章
- bzoj千题计划105:bzoj3503: [Cqoi2014]和谐矩阵(高斯消元法解异或方程组)
http://www.lydsy.com/JudgeOnline/problem.php?id=3503 b[i][j] 表示i对j是否有影响 高斯消元解异或方程组 bitset优化 #include ...
- fzu1704(高斯消元法解异或方程组+高精度输出)
题目链接:https://vjudge.net/problem/FZU-1704 题意:经典开关问题,求使得灯全0的方案数. 思路:题目保证至少存在一种方案,即方程组一定有解,那么套上高斯消元法的板子 ...
- 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组
[题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...
- bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)
http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...
- Bzoj3517 翻硬币题解 解异或方程组
3517: 翻硬币 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 281 Solved: 211[Submit][Status][Discuss] D ...
- 高斯消元法求解异或方程组: cojs.tk 539.//BZOJ 1770 牛棚的灯
高斯消元求解异或方程组: 比较不错的一篇文章:http://blog.sina.com.cn/s/blog_51cea4040100g7hl.html cojs.tk 539. 牛棚的灯 ★★☆ ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解异或方程组)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10835 Accepted: 6 ...
- POJ1222 高斯消元法解抑或方程
第一次学怎么用高斯消元法解抑或方程组,思想其实很简单,方法可以看下面的链接:http://blog.csdn.net/zhuichao001/article/details/5440843 有了这种思 ...
- bzoj千题计划188:bzoj1923: [Sdoi2010]外星千足虫 (高斯—若尔当消元法解异或方程组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1923 #include<cstdio> #include<cstring> ...
随机推荐
- MySQL 一次非常有意思的SQL优化经历:从30248.271s到0.001s
转载自:https://www.toutiao.com/i6668275333034148356 一.背景介绍 用的数据库是mysql5.6,下面简单的介绍下场景 课程表: 数据100条 学生表: 数 ...
- 蓝牙4.0模块,AT指令集
一,LED状态 二,蓝牙模块有两种通信模式 1,AT指令模式 2,数据透传模式 三.AT指令程序设计 1.设置模块的名字 void usart3_send_str(char *pbuf) { whil ...
- [Luogu] 区间统计Tallest Cow
https://www.luogu.org/problemnew/show/P2879 差分 | 线段树 #include <iostream> #include <cstdio&g ...
- [Luogu] 网络
https://www.luogu.org/problemnew/show/P3250 树链剖分 + 线段树 + 优先队列 要求未被影响的请求中最大的 所以每次将每条路径在整棵树上的补集的每个节点的优 ...
- [USACO5.5] 矩形周长Picture
https://www.luogu.org/problemnew/show/P1856 1.每个矩形由两条横向边和两条纵向边组成. 2.对于横向边,按纵坐标排序.设当前讨论的边为 A [s , t] ...
- _cdecl与_stdcall区别
_cdecl与_stdcall是最常用的的两种函数调用修饰,区别在于函数返回时,清理栈(恢复栈平衡)是caller做还是被调函数做. : _cdecl int add1(int a, int b) : ...
- 爬虫之解析库Xpath
简介 XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言. XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力.起初XPat ...
- c标签forEach
<c:forEach items="${requestScope.getUserMenuModelList}" var="item" varStatus= ...
- 第11组 Beta冲刺(4/5)
第11组 Beta冲刺(4/5) 队名 不知道叫什么团队 组长博客 https://www.cnblogs.com/xxylac/p/12018586.html 作业博客 https://edu. ...
- 【Java】异常的平行处理
Java对异常的处理,是平行的处理,进行了特定异常的处理后,便不会进入通用异常的处理,出现了未曾显式捕获的异常时,才会进入最宽泛的Excption处理. 具体请看下面代码: package com.h ...