中文题 题意不多说

这题乍一看 就是求个自由未知量个数 相当简单

其实呢 其中要注意的细节还是很多的:

1.光求了自由未知量个数 还不够 ∵求的是可行方案的总数  因此 答案是 2^(自由未知量个数)

2.此题转化成方程组比较麻烦

  给了初始状态和最终状态 : ∵对于任意一个开关,最多只能进行一次开关操作。 ∴此开关的初始状态与最终状态不同(即异或)就需进行操作

3.还有一个坑!

  操作第 I 个开关,第J个开关的状态也会变化。

  应将a[J-1][I-1]置1 而非a[I-1][J-1]     (因为是将 可以影响该位置改变的 位置置1

 int a[][];  // 增广矩阵
int x[]; // 解
int free_x[]; // 标记是否为自由未知量 int n;
void debug()
{
for(int i=;i<n*n;i++)
{
for(int j=;j<n*n;j++)
printf("%d ", a[i][j]);
printf("\n");
}
} int Gauss(int n, int m) // n个方程 m个未知数 即 n行m+1列
{
//转换为阶梯形式
int col=, k, num=;
for(k=;k<n && col<m;k++, col++)
{//枚举行
int max_r=k;
for(int i=k+;i<n;i++)//找到第col列元素绝对值最大的那行与第k行交换
if(abs(a[i][col])>abs(a[max_r][col]))
max_r=i;
if(max_r!=k)// 与第k行交换
for(int j=col;j<m+;j++)
swap(a[k][j], a[max_r][j]);
if(!a[k][col])// 说明该col列第k行以下全是0了
{
k--;
free_x[num++]=col;
continue;
}
for(int i=k+;i<n;i++)// 枚举要删除的行
if(a[i][col])
for(int j=col;j<m+;j++)
a[i][j]^=a[k][j];
} // debug();
// printf("%d %d\n", col, k); for(int i=k;i<n;i++)
if(a[i][col])
return -; // 无解
return m-k;
// if(k<m) //m-k为自由未知量个数
// {
// int stat=1<<(m-k);
// int ans=INT_MAX;
// for(int i=0;i<stat;i++)
// {
// int cnt=0;
// for(int j=0;j<m-k;j++)
// if(i&(1<<j))
// {
// x[free_x[j]]=1;
// cnt++;
// }
// else
// x[free_x[j]]=0;
// for(int j=k-1;j>=0;j--)
// {
// int tmp;
// for(tmp=j;tmp<m;tmp++)
// if(a[j][tmp])
// break;
// x[tmp]=a[j][m];
// for(int l=tmp+1;l<m;l++)
// if(a[j][l])
// x[tmp]^=x[l];
// cnt+=x[tmp];
// }
// if(cnt<ans)
// ans=cnt;
// }
// return ans;
// } // // 唯一解 回代
// for(int i=m-1;i>=0;i--)
// {
// x[i]=a[i][m];
// for(int j=i+1;j<m;j++)
// x[i]^=(a[i][j] && x[j]);
// }
// int ans=0;
// for(int i=0;i<n*n;i++)
// ans+=x[i];
// return ans;
} void init()
{
n=;
memset(a, , sizeof(a));
memset(x, , sizeof(x));
for(int i=;i<n;i++)
for(int j=;j<n;j++)
{
int t=i*n+j;
a[t][t]=;
if(i>)
a[(i-)*n+j][t]=;
if(i<n-)
a[(i+)*n+j][t]=;
if(j>)
a[i*n+j-][t]=;
if(j<n-)
a[i*n+j+][t]=;
}
} int s1[], s2[];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i=;i<n;i++)
scanf("%d", &s1[i]);
for(int i=;i<n;i++)
scanf("%d", &s2[i]);
int X, Y;
memset(a, , sizeof(a));
memset(x, , sizeof(x));
while(scanf("%d%d", &X, &Y))
{
if(!X && !Y)
break;
a[Y-][X-]=;
}
for(int i=;i<n;i++)
{
a[i][i]=;
a[i][n]=s1[i]^s2[i];
}
int t=Gauss(n, n);
if(t==-)
{
printf("Oh,it's impossible~!!\n");
continue ;
}
printf("%d\n", <<t);
}
return ;
}

POJ 1830

[Gauss]POJ1830 开关问题的更多相关文章

  1. POJ1830开关问题——gauss消元

    题目链接 分析: 第一个高斯消元题目,操作是异或.奇偶能够用0.1来表示,也就表示成bool类型的方程,操作是异或.和加法没有差别 题目中有两个未知量:每一个开关被按下的次数(0.1).每一个开关的转 ...

  2. [POJ1830]开关问题(高斯消元,异或方程组)

    题目链接:http://poj.org/problem?id=1830 题意:中文题面,求的是方案数. 首先可以知道, 如果方案数不止一个的话,说明矩阵行列式值为0,即存在自由变元,由于变量只有两种状 ...

  3. POJ1830开关问题

    这题答案就是2^自由元的数目,原因是自由元可以取1或者0,所以就是ans<<1 由于只要求自由元的数目,所以高斯消元可以直接消后面的,不做前面的了,对答案没有影响 #include< ...

  4. [poj1830]开关问题(高斯消元)

    题意:求高斯消元中自由元的个数,输出1<<ans; #include<cstdio> #include<cstdlib> #include<cstring&g ...

  5. poj1830开关问题——异或高斯消元

    题目:http://poj.org/problem?id=1830 根据题意,构造出n元方程组: a(1,1)x1 ^ a(1,2)x2 ^ a(1,3)x3 ... a(1,n)xn = st1 ^ ...

  6. poj1830 开关问题[高斯消元]

    其实第一反应是双向BFS或者meet in middle,$2^{14}$的搜索量,多测,应该是可以过的,但是无奈双向BFS我只写过一题,已经不会写了. 发现灯的操作情况顺序不影响结果,因为操作相当于 ...

  7. poj1830:开关问题

    链接:http://poj.org/problem?id=1830 某天“佐理慧学姐”突然来问了我这道题. 诶,窝只会线性基,但是好像搞不了方案数啊…… 啃题解吧. woc!线性代数哦,就是那种我不会 ...

  8. POJ 1830 开关问题(Gauss 消元)

    开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7726   Accepted: 3032 Description ...

  9. POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题

    http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...

随机推荐

  1. java面板

    import java.awt.Color; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JLab ...

  2. Javascript原型钩沉

    写在前面的总结: JS当中创建一个对象有好几种方式,大体上就是以下几种: ①通过var obj ={...} 这种方式一般称为字面量方式,{}直接写需要定义的字段 ②var obj = new Obj ...

  3. 12天学好C语言——记录我的C语言学习之路(Day 8)

    12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...

  4. 【html】【8】div布局[子div在父div居底]

    从今天起 开始细话div布局   思路及要点: 父div的位置设置成相对的,即“position: relative;”. 而子div的位置设置成绝对的,并且下边缘设为0,即“position: ab ...

  5. Ajax的概述与实现过程

    一.ajax概述 1.Ajax是Asynchronous([ə'sɪŋkrənəs) JavaScript XML的简写,不是一门新技术,而是对现有技术的综合利用.这一技术能够向服务器请求额外数据而无 ...

  6. 理解css 中的position五个属性

    在实际开发页面布局时,运用position,对定位的块级元素的嵌套的效果总是不太理解,这里做了几个测试 一般的在w3c中我们可以很容易的获取定义: static : 默认值.没有定位,元素出现在正常的 ...

  7. 常用AWK命令

    常用AWK命令 Awk is a programming language which allows easy manipulation of structured data and the gene ...

  8. OpenJudge/Poj 1191 棋盘分割

    1.链接地址: http://bailian.openjudge.cn/practice/1191/ http://poj.org/problem?id=1191 2.题目: 总时间限制: 1000m ...

  9. resin的简单介绍和使用

    1.resin是一款应用服务器(application server),它自身也包含一款支持Http1.1协议的WEB服务器(web server),它也可以和其他的web服务器一起工作如IIS和Ap ...

  10. centos7下编译qt的mysql驱动

    在编译mysql驱动之前,首先要安装mysql,可以使用yum安装,这里将不再介绍. 在将qt和mysql都安装好之后,首先找到mysql的头文件以及他的共享库,我的mysql是使用yum安装的,头文 ...