请问,2开开关灯泡怎么接线让两个开关都可以开灯时开关滋滋响呢?下面有图片

1100人阅读
acm_数学问题(163)
Time Limit: 1000MS
Memory Limit: 30000K
Total Submissions: 2033
Accepted: 654
Description
有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)
输入第一行有一个数K,表示以下有K组测试数据。
每组测试数据的格式如下:
第一行 一个数N(0 & N & 29)
第二行 N个0或者1的数,表示开始时N个开关状态。
第三行 N个0或者1的数,表示操作结束后N个开关的状态。
接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。每组数据以 0 0 结束。
如果有可行方法,输出总数,否则输出“Oh,it's impossible~!!” 不包括引号
Sample Input
Sample Output
Oh,it's impossible~!!
第一组数据的说明:
一共以下四种方法:
操作开关1、2、3 (不记顺序)
注意此题中方程要mod2
#include &iostream&
#include &string&
#include &cmath&
#include &cstdio&
#include &cstring&
const int maxn = 105;
//系数矩阵大小为 equ*var
int a[maxn][maxn];
int x[maxn]; // 解集.
int mat[30][30];
int Gauss_XOR(int a[maxn][maxn], int x[maxn], int var, int equ)
&&& int row,
&&& for (row = col = 1; row &= equ && col &= ++row, ++col)
&&&&&&& if (!a[row][col])
&&&&&&&&&&& for (int i = i & --i)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& if (a[i][col])
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& for (int j = j &= var + 1; ++j)
&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&& swap(a[i][j], a[row][j]);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&& if (!a[row][col])
&&&&&&&&&&& --
&&&&&&&&&&&
&&&&&&& for (int i = row + 1; i &= ++i)
&&&&&&&&&&& if (a[i][col])
&&&&&&&&&&& {
&&&&&&&&&&&&&&& for (int j = var + 1; j &= --j)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& a[i][j] ^= a[row][j];
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&& for (int i = i &= ++i)
&&&&&&& if (a[i][var + 1]) return -1;
&&& if (row &= var)
&&&&&&& return var - row + 1;
&&& for (int i = i &= 1; --i)
&&&&&&& x[i] = a[i][var + 1];
&&&&&&& for (int j = i + 1; j &= ++j)
&&&&&&&&&&& x[i] ^= a[i][j] && x[j];
&&& return 0;
int main()
&&&scanf(&%d&,&ci);
&&& while(ci--)
&&&&&&& //初始化
&&&&&&& memset(a,0,sizeof(a));
&&&&&&& memset(x,0,sizeof(x));
&&&&&&&scanf(&%d&,&n);
&&&&&&& memset(mat,0,sizeof(mat));
&&&&&&& int st[30],ed[30];
&&&&&&& for (int i = 1; i &=n; i++) scanf(&%d&, &st[i]);
&&&&&&& for (int i = 1; i &=n; i++) scanf(&%d&, &ed[i]);
&&&&&&& //important
&&&&&&& for(int i=1;i&=n;i++) a[i][n+1]=st[i]^ed[i];//增广矩阵最后一列
&&&&&&& equ=var=n;//
&&&&&&& int u,v;
&&&&&&& while(scanf(&%d%d&,&u,&v),u||v) mat[v][u]=1;
&&&&&&& for(int i=1;i&=n;i++)
&&&&&&&&&&& for(int j=1;j&=n;j++)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& if(i==j||mat[i][j]) a[i][j]=1;
&&&&&&&&&&& }
&&&&&&& int free_num=Gauss_XOR(a,x,var,equ);//解个数
&&&&&&& if(free_num==-1) printf(&Oh,it's impossible~!!\n&);
&&&&&&& else
&&&&&&&&&&& //如果解为无穷多,则此题中应输出2^free_num
&&&&&&&&&&& printf(&%d\n&,(int)pow(2.0,free_num));
&&& return 0;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:504275次
积分:12194
积分:12194
排名:第803名
原创:749篇
评论:52条
(1)(1)(1)(1)(54)(91)(48)(30)(3)(28)(28)(24)(2)(16)(57)(68)(66)(209)(25)有人知道一个灯两个开关怎么接吗?来自:
日分享至 :
下一篇:上一篇:其它类似问题相关文章相关帖子---有人知道一个灯两个开关怎么接吗?}

我要回帖

更多关于 开灯时开关滋滋响 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信