开关问题
Posted mrh-acmer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开关问题相关的知识,希望对你有一定的参考价值。
有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)
Input
输入第一行有一个数K,表示以下有K组测试数据。
每组测试数据的格式如下:
第一行 一个数N(0 < N < 29)
第二行 N个0或者1的数,表示开始时N个开关状态。
第三行 N个0或者1的数,表示操作结束后N个开关的状态。
接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。每组数据以 0 0 结束。
Output
每组测试数据的格式如下:
第一行 一个数N(0 < N < 29)
第二行 N个0或者1的数,表示开始时N个开关状态。
第三行 N个0或者1的数,表示操作结束后N个开关的状态。
接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。每组数据以 0 0 结束。
如果有可行方法,输出总数,否则输出“Oh,it‘s impossible~!!” 不包括引号
Sample Input
2 3 0 0 0 1 1 1 1 2 1 3 2 1 2 3 3 1 3 2 0 0 3 0 0 0 1 0 1 1 2 2 1 0 0Sample Output
4 Oh,it‘s impossible~!!Hint
第一组数据的说明:
一共以下四种方法:
操作开关1
操作开关2
操作开关3
操作开关1、2、3 (不记顺序)
一共以下四种方法:
操作开关1
操作开关2
操作开关3
操作开关1、2、3 (不记顺序)
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; #define maxn 50 int a[maxn][maxn], length, ans[maxn]; void Gauss() { int i, j, k, r, col; for(k = 0, col = 0; k < length&&col < length; k++, col++) { int i = k; while(i < length&&a[i][col] == 0) i++; if(a[i][col] == 0) { k--; continue; } if(i > k) { for(r = col; r <= length; r++) { swap(a[i][r], a[k][r]); } } for(i = k+1; i < length; i++) { if(a[i][col]) { for(j = col; j <= length; j++) a[i][j] ^= a[k][j]; } } } for(i = k; i <length; i++) { if(a[i][length] != 0) { printf("Oh,it‘s impossible~!! "); return; } } printf("%d ",(1 << (length - k))); return; } int main() { int i, T; scanf("%d", &T); while(T--) { memset(a, 0, sizeof(a)); scanf("%d",&length); for(i = 0; i < length; i++) { scanf("%d", &a[i][length]); a[i][i] = 1; } int x; for(i = 0; i <length; i++) { scanf("%d", &x); a[i][length] = a[i][length]^x; } int m, n; while(~scanf("%d %d", &m, &n)) { if(m+n == 0) break; a[n-1][m-1] = 1; } Gauss(); } return 0; }
以上是关于开关问题的主要内容,如果未能解决你的问题,请参考以下文章
Python 自动化 - 浏览器chrome打开F12开发者工具自动Paused in debugger调试导致无法查看网站资源问题原因及解决方法,javascript反调试问题处理实例演示(代码片段