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> ... 
随机推荐
- Flutter布局2--Align
			Align控件即对齐控件,能将子控件所指定方式对齐,并根据子控件的大小调整自己的大小. eg: 文字组件对齐于右下方 new Align( alignment: FractionalOffset.bo ... 
- vue的跳转方式(打开新页面)
			vue的跳转方式(打开新页面) 2018年11月22日 10:43:21 浊清... 阅读数 2043 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和 ... 
- AbstractWrapper ,EntityWrapper, QueryWrapper, UpdateWrappe
			https://blog.csdn.net/qq_42112846/article/details/88086035 https://blog.csdn.net/m0_37034294/article ... 
- 【线性代数】7-3:对角化和伪逆(Diagonalization and the Pseudoinverse)
			title: [线性代数]7-3:对角化和伪逆(Diagonalization and the Pseudoinverse) categories: Mathematic Linear Algebra ... 
- 浅谈神经网络中的bias
			1.什么是bias? 偏置单元(bias unit),在有些资料里也称为偏置项(bias term)或者截距项(intercept term),它其实就是函数的截距,与线性方程 y=wx+b 中的 b ... 
- redis之redis-cluster配置
			为什么要用redis-cluster 并发问题 redis官方生成可以达到 10万/每秒,每秒执行10万条命令 假如业务需要每秒100万的命令执行呢? 数据量太大 一台服务器内存正常是16~256G, ... 
- SSRF漏洞攻击利用从浅到深
			梳理一下ssrf 不详细 简单记录 0x01 SSRF成因和基本利用0x02 内网打未授权redis0x03 关于ssrf打授权的redis0x04 写redis shell和密钥的一点问题0x05 ... 
- springboot的jar在linux运行
			springboot项目使用maven打包成jar包,如何在linux优雅部署?平时启动项目使用java -jar命令,关闭程序需要查询pid再查杀进程,这样都太麻烦了,今天发现一个博客已经写好的脚本 ... 
- 编写第一个Servlet程序
			在开始这一节之前呢,我们还需要把Tomcat配置到Eclipse中,配置的方式很简单,打开Eclipse,Window,Preferences,进入到这个页面 将Tomcat的安装目录配置到Eclip ... 
- 查询Oracle正在执行的sql语句及kill被锁的表
			查询Oracle正在执行的sql语句及执行该语句的用户SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, pa ... 
