poj1830开关问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1830开关问题相关的知识,希望对你有一定的参考价值。

【题意】

  与poj1222类似,只不过关系不再是通过矩阵体现,而是直接给出。

【题解】

  根据关系建立出方程组,再高斯消元。若求出变元个数为num,答案即等于2^num。若解方程时有一个方程未知数系数为0,常数不为0,则是无解。

【代码】

 

技术分享
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 struct node
 6 {
 7     int vec[31],c;
 8 }a[31];
 9 int T,n,x,y,ans;
10 int gauss()
11 {
12     int po;
13     for (int i=1,o=1;o<=n;)
14     {
15         for (int j=i;j<=n;++j)
16             if (a[j].vec[o])
17             {
18                 swap(a[i],a[j]);
19                 break;
20             }
21         if (!a[i].vec[o])
22         {
23             ++o;
24             continue;
25         }
26         for (int j=i+1;j<=n;++j)
27             if (a[j].vec[o])
28             {
29                 if (a[i].c)    a[j].c^=1;
30                 for (int k=o;k<=n;++k)
31                     if (a[i].vec[k])    a[j].vec[k]^=1;
32             }
33         ++i;++o;po=i;
34     }
35     ans=1;
36     for (int i=po;i<=n;++i)
37         if (a[i].c)    return -1;
38         else ans<<=1;
39     return ans;
40 }
41 int main()
42 {
43     scanf("%d",&T);
44     while (T--)
45     {
46         scanf("%d",&n);
47         memset(a,0,sizeof(a));
48         for (int i=1;i<=n;++i)    scanf("%d",&a[i].c);
49         for (int i=1;i<=n;++i)
50         {
51             scanf("%d",&x);
52             a[i].c^=x;
53             a[i].vec[i]=1;
54         }
55         while(1)        
56         {
57             scanf("%d%d",&x,&y);
58             if (!x||!y)    break;
59             a[y].vec[x]=1;
60         }
61         ans=gauss();
62         if (ans==-1)    puts("Oh,it‘s impossible~!!");
63         else    printf("%d\n",ans);
64     }
65     return 0;
66 }
View Code

 

以上是关于poj1830开关问题的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1830 开关问题

poj 1830 开关问题

POJ 1830 开关问题

POJ 1830 开关问题 高斯消元,自由变量个数

POJ 1830 开关问题

poj1830(求解xor方程组)