博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1830 开关灯问题(高斯消元法)
阅读量:4455 次
发布时间:2019-06-07

本文共 1636 字,大约阅读时间需要 5 分钟。

ExpandedBlockStart.gif
View Code 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 
using 
namespace std;
 7 
 8 
const 
int maxn=
110;
 9 
int a[maxn][maxn];
10 
int n,a1[maxn],a2[maxn];
11 inline 
int fab(
int x)
12 {
13     
return x>
0?x:-x;
14 }
15 inline 
void swap(
int &x,
int &y)
16 {
17     
int temp=x;
18     x=y;
19     y=temp;       
20 }
21 
int Gauss()
22 {
23     
int i,j,k,max_r,t;
24     
for(i=
0,j=
0;i<n&&j<n;i++,j++)
25     {
26         max_r=i;
27         
for(k=i+
1;k<n;k++)
28             
if(fab(a[k][j])>fab(a[max_r][j]))
29                 max_r=k;
30             
if(max_r!=i)
31             {
32                 
for(t=j;t<=n;t++)
33                     swap(a[i][t],a[max_r][t]);
34             }
35             
if(a[i][j]==
0)
36             {
37                 i--;
38                 
continue;
39             }
40             
for(k=i+
1;k<n;k++)
41             {
/*
42 
                if(a[k][j]!=0)
43 
                {
44 
                    for(t=j;t<n+1;t++)
45 
                        a[k][t]=a[k][t]^a[i][t];
46 
                }
*/
47                 
if(a[k][j]==
0)
48                     
continue;
49                 
for(t=j;t<=n;t++)
50                     a[k][t]=a[k][t]^a[i][t];
51             }
52     }
53     
for(k=i;k<n;k++)
//
无解
54 
        
if(a[k][n]!=
0)
55             
return -
1;
56     
if(i==n)
//
唯一解
57 
        
return 
1;
58     
return 
1<<(n-i);
//
有n-i个未知变量
59 
}
60 
int main()
61 {
62     
int k,i;
//
int k,n,i;
63 
    scanf(
"
%d
",&k);
64     
while(k--)
65     {
66         scanf(
"
%d
",&n);
67         memset(a,
0,
sizeof(a));
68         
for(i=
0;i<n;i++)
69             scanf(
"
%d
",&a1[i]);
70         
for(i=
0;i<n;i++)
71             scanf(
"
%d
",&a2[i]);
72         
int y,z;
73         
while(scanf(
"
%d %d
",&y,&z)&&y!=
0&&z!=
0)
74         {
75             a[y-
1][z-
1]=
1;
76         }
77         
for(i=
0;i<n;i++)
78         {
79             a[i][i]=
1;
80             a[i][n]=a1[i]^a2[i];
//
why???
81 
            
/*
if(a1[i]!=a2[i])
82 
                a[i][n]=1;
83 
            else
84 
                a[i][n]=0;
*/
85         }
86         
int ans=Gauss();
87         
if(ans==-
1)
88             printf(
"
Oh,it's impossible~!!\n
");
89         
else
90             printf(
"
%d\n
",ans);
91     }
92     
return 
0;
93     
94

转载于:https://www.cnblogs.com/wconvey/archive/2012/06/06/2538859.html

你可能感兴趣的文章
2015生命之旅---南京、南通、上海之行
查看>>
高精度练习之乘法(codevs_3117)
查看>>
小Z爱划水
查看>>
Qt Font
查看>>
2014年生日
查看>>
扫描目录下的文件并拼接在一起
查看>>
ELK 分布式日志处理 10.12
查看>>
Java虚拟机详解05----垃圾收集器及GC参数
查看>>
7. 单位,移动布局
查看>>
inux中bin与sbin目录的作用及区别介绍
查看>>
USACO 3.1 Contact
查看>>
Office之什么是高内聚低耦合
查看>>
一些奇怪的问题求回答
查看>>
这些年踩过的坑
查看>>
iOS开发拓展篇——如何把项目托管到GitHub
查看>>
性能优化之数据库优化
查看>>
类的继承、菱形继承、派生、多态
查看>>
mysql约束
查看>>
javascript鼠标及键盘事件总结及案例
查看>>
mysql表之间的关系及级联操作
查看>>