poj1753 (高斯消元法求异或方程组)
题目链接:http://poj.org/problem?id=1753
题意:经典开关问题,和poj1222一样,进行两次高斯消元即可,只用初始化的时候改一下初始状态。可能存在无解或多解的情况,多解要枚举自由变元的所有状态。
AC代码:
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std; const int maxn=;
const int inf=0x3f3f3f3f;
int mp[][],a[maxn][maxn],x[maxn],equ,var,free_x[maxn];
char s[]; void init(int p){
memset(a,,sizeof(a));
for(int i=;i<;++i){
for(int j=;j<;++j){
int t=i*+j;
a[t][]=p^mp[i][j];
a[t][t]=;
if(i>) a[t][(i-)*+j]=;
if(i<) a[t][(i+)*+j]=;
if(j>) a[t][i*+j-]=;
if(j<) a[t][i*+j+]=;
}
}
} int Gauss(){
int r=,cnt=;
for(int c=;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(Maxr!=r){
for(int i=c;i<var+;++i)
swap(a[r][i],a[Maxr][i]);
}
if(!a[r][c]){
--r;
free_x[cnt++]=c;
continue;
}
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=r;i<equ;++i)
if(a[i][var])
return -;
return var-r;
} int solve(int t){
int ret=inf;
for(int i=;i<(<<t);++i){
int cnt=;
memset(x,,sizeof(x));
for(int j=;j<t;++j){
if((i>>j)&){
++cnt;
x[free_x[j]]=;
}
}
for(int j=var-t-;j>=;--j){
int tmp=a[j][var],tp,ok=;
for(int k=j;k<var;++k){
if(!a[j][k]) continue;
if(ok){
ok=;
tp=k;
}
else{
tmp^=x[k];
}
}
x[tp]=tmp;
cnt+=x[tp];
}
ret=min(ret,cnt);
}
return ret;
} int main(){
equ=var=;
for(int i=;i<;++i){
scanf("%s",s);
for(int j=;j<;++j)
if(s[j]=='b') mp[i][j]=;
else mp[i][j]=;
}
init();
int t1,t2,t3,t4;
t1=Gauss();
if(t1!=-) t2=solve(t1);
init();
t3=Gauss();
if(t3!=-) t4=solve(t3);
if(t1==-&&t3==-)
printf("Impossible\n");
else
printf("%d\n",min(t2,t4));
return ;
}
poj1753 (高斯消元法求异或方程组)的更多相关文章
- (模板)poj1681 高斯消元法求异或方程组(无解、唯一解、多解)
题目链接:https://vjudge.net/problem/POJ-1681 题意:类似于poj1222,有n×n的01矩阵,翻转一个点会翻转其上下左右包括自己的点,求最少翻转多少点能使得矩阵全0 ...
- Zhu and 772002---hdu5833(高斯消元解求异或方程组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5833 题意:给n个数,选择一些数字乘积为平方数的选择方案数. 分析:每一个数字分解质因数.比如4, 6 ...
- POJ 1222 (开关问题+高斯消元法)
题目链接: http://poj.org/problem?id=1222 题目大意:一堆开关,或开或关.每个开关按下后,周围4个方向开关反转.问使最后所有开关都关闭的,开关按法.0表示不按,1表示按. ...
- POJ1222 高斯消元法解抑或方程
第一次学怎么用高斯消元法解抑或方程组,思想其实很简单,方法可以看下面的链接:http://blog.csdn.net/zhuichao001/article/details/5440843 有了这种思 ...
- 小游戏 Lights Out (关灯) 的求解 —— 异或方程组
Author : Evensgn Blog Link : http://www.cnblogs.com/JoeFan/ Article Link : http://www.cnblogs.com/J ...
- BestCoder Round #90
有生以来第一场在COGS以外的地方打的比赛.挂成dog了. 主要是没有经验,加之代码能力过弱.还有最后的瞎hack三次,Too Young Too Simple...... 言归正传. (抄一发题解先 ...
- HDU3915 Game 高斯消元
题目链接 HDU3915 Game 高斯消元 题解 求异或方程组自由元的子集个数 高斯消元求秩,内存溢出好神 代码 #include<bitset> #include<cstdio& ...
- hiho #1196 : 高斯消元·二
#1196 : 高斯消元·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中,小Hi和小Ho趁着便利店打折,买了一大堆零食.当他们结账后,看到便利店门口还有其 ...
- Codeforces Round #448 C. Square Subsets
题目链接 Codeforces Round #448 C. Square Subsets 题解 质因数 *质因数 = 平方数,问题转化成求异或方程组解的个数 求出答案就是\(2^{自由元-1}\) , ...
随机推荐
- Security Study
1.WebGoat http://www.owasp.org.cn/ 学习Web应用漏洞最好的教程----WebGoat http://blog.csdn.net/bill_lee_sh_cn/art ...
- alarm函数
alarm函数 设置定时器(闹钟).在指定seconds后,内核会给当前进程发送14)SIGALRM信号.进程收到该信号,默认动作终止. 每个进程都有且只有唯一个定时器. unsigned int a ...
- MySQL数据分析-(6)数据库设计之规范化
大家好,我是jacky,很高兴继续跟大家学习MySQL数据分析这门课,上次课我们介绍了E-R图,我们要给手机销售公司设计数据库,那么同一个项目,10个设计人员可能设计出10种不同的E-R图:因为不同的 ...
- c 判断是否为nan
/* isnan example */ #include <stdio.h> /* printf */ #include <math.h> /* isnan, sqrt */ ...
- Linux监控工具介绍系列——iostat
文章转自:https://www.cnblogs.com/ghj1976/p/5691857.html Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iost ...
- Java中常见的集合类比较
Collection 是对象集合, Collection 有两个子接口 List 和 Set,List 可以通过下标 (1,2..) 来取得值,值可以重复,而 Set 只能通过游标来取值,并且值是不能 ...
- Vue 的基本认识
1.1.1. 官网 1) 英文官网: https://vuejs.org/ 2) 中文官网: https://cn.vuejs.org/ 1.1.2. 介绍描述 1) 渐进式 JavaScript ...
- appdomain概念与应用
用appcmd命令显示w3wp.exe进程,很多时候一个应用程序池负责创建一个w3wp.exe进程与之对应,可能还有时候是创建多个w3wp.exe,有待验证. c:\Windows\System32\ ...
- H5本地存储详解
H5之前存储数据一般是通过 cookie ,但是 cookie 存的数据容量比较少.H5 中扩充了文件存储能力,可存储多达 5MB 的数据.现在就实际开发经验来对本地存储 ( Storage ) 的使 ...
- 【Java】异常的平行处理
Java对异常的处理,是平行的处理,进行了特定异常的处理后,便不会进入通用异常的处理,出现了未曾显式捕获的异常时,才会进入最宽泛的Excption处理. 具体请看下面代码: package com.h ...