中文题 题意不多说

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

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

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. 抽象(abstract)升级版变接口(interface) 继承(extends)升级版叫实现(implements) 升级版啊升级版 接口可以多继承

    Client --------------------------------------------------- public class Client{ public static void m ...

  2. 20160502-struts2入门--ognl表达式

    一.OGNL表达式语言 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts 2框架使用OGNL作为默认的表达式语言 ...

  3. 对 ASP.NET 页面进行跟踪(Control Tree)

    在页面头部加入属性 : Trace="True" 参考MSDN: https://msdn.microsoft.com/zh-cn/library/94c55d08(v=vs.10 ...

  4. CSS高度塌陷

    问题描述:当父元素只包含浮动的元素的时候,且父元素没有设置高度,如果父元素设置了边框border,那么看起来子元素不在父元素之内. 比如这样: html: <div id="paren ...

  5. 08_rlCoachKin自主编译,调试

    为了知道参数的意思,以及为了从头建立一个项目,我从使用QTCreator来单独建立项目(当然也可以直接使用源代码中建立好的VS项目). 其实也推荐 VS2010调试 如果是用自带的VS项目,那么我们需 ...

  6. (转)MySQL Workbench的使用教程 (初级入门版)

    转自:http://www.cnblogs.com/yqskj/archive/2013/03/01/2938027.html MySQL Workbench 是 MySQL AB 最近释放的可视数据 ...

  7. 七牛云覆盖上传 php

    使用七牛云过程中遇到了需要上传覆盖的情况,最终解决,分享给大家. 七牛云sdk上传示例中是这样写的 <?php require_once 'path_to_sdk/vendor/autoload ...

  8. JQuery(一) 入门

    JQuery是一个JS库,可以跨浏览器运行,若开发者面对jQuery编程,则可以在不同的浏览器自由切换. jQuery不再像JS一样面向DOM,而是面向jQuery对象. jQuery提供$()函数, ...

  9. VM 启动时报错:Failed to lock the file

    http://www.cnblogs.com/kristain/articles/2491966.html Reason: Failed to lock the fileGoogle 了一下, 在網路 ...

  10. myeclipse10.0优化

    一.Myeclipse10修改字体  MyEclipse10是基于Eclipse3.7内核,但在Eclipse的Preferences-〉general-〉 Appearance->Colors ...