首页 > 其他 > 详细

高斯消元系列

时间:2014-03-15 05:37:37      阅读:439      评论:0      收藏:0      [点我收藏+]

高斯第一篇 

poj1222 EXTENDED LIGHTS OUT 

状压枚举法

bubuko.com,布布扣
  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #include<set>
 10 using namespace std;
 11 #define N 100000
 12 #define LL long long
 13 #define INF 0xfffffff
 14 const double eps = 1e-8;
 15 const double pi = acos(-1.0);
 16 const double inf = ~0u>>2;
 17 int f[10][1<<6],a[8],b[8][8],o[10][1<<6];
 18 char s[8][8];
 19 int main()
 20 {
 21     int i,j,g,t,kk=0;
 22     cin>>t;
 23     while(t--)
 24     {
 25         for(i = 1 ; i <= 5 ; i++)
 26         {
 27             for(j = 0 ; j < 6 ; j++)
 28             {
 29                 cin>>s[i][j];
 30                 b[i][j] = s[i][j]-0;
 31             }
 32         }
 33 
 34         for(i = 0 ; i < (1<<6) ; i++)
 35         {
 36             for(j = 0 ; j < 6 ; j++)
 37             a[j] = b[1][j];
 38             for(g = 0 ; g < 6 ; g++)
 39             if((1<<g)&i)
 40             {
 41                 if(g==0)
 42                 {
 43                     a[g] = (a[g]+1)%2;
 44                     a[g+1] = (a[g+1]+1)%2;
 45                 }
 46                 else
 47                 {
 48                     a[g] = (a[g]+1)%2;
 49                     a[g-1] = (a[g-1]+1)%2;
 50                     a[g+1] = (a[g+1]+1)%2;
 51                 }
 52             }
 53 
 54             int tt = 0;
 55             for(j = 0 ; j < 6 ; j++)
 56             tt+=(1<<j)*a[j];
 57             f[1][tt] = 1;
 58             o[1][tt] = i;
 59         }
 60         for(i = 2; i <= 5 ; i++)
 61         {
 62             for(j = 0 ; j < (1<<6) ; j++)
 63             {
 64                 if(!f[i-1][j]) continue;
 65                 for(g = 0  ;g < 6 ; g++)
 66                 a[g] = b[i][g];
 67                 for(g = 0 ; g < 6 ; g++)
 68                 {
 69                     if((1<<g)&j)
 70                     {
 71                         if(g==0)
 72                         {
 73                             a[g] = (a[g]+1)%2;
 74                             a[g+1] = (a[g+1]+1)%2;
 75                         }
 76                         else
 77                         {
 78                             a[g] = (a[g]+1)%2;
 79                             a[g-1] = (a[g-1]+1)%2;
 80                             a[g+1] = (a[g+1]+1)%2;
 81                         }
 82                     }
 83                     if(o[i-1][j]&(1<<g))
 84                     a[g]= (a[g]+1)%2;
 85                 }
 86                 int sum=0;
 87                 for(g = 0 ; g < 6 ; g++)
 88                 sum+=(1<<g)*a[g];
 89                 f[i][sum] = f[i-1][j];
 90                 o[i][sum] = j;
 91             }
 92         }
 93         int t = 0;
 94         printf("PUZZLE #%d\n",++kk);
 95         for(i = 5 ; i >= 1; i--)
 96         {
 97             t = o[i][t];
 98             for(j = 0 ; j < 6 ; j++)
 99             {
100                 if(t&(1<<j))
101                 b[i][j] = 1;
102                 else
103                 b[i][j] = 0;
104             }
105         }
106         for(i = 1 ; i <= 5 ; i++)
107         {
108             for(j = 0 ; j < 5 ; j++)
109             cout<<b[i][j]<<" ";
110             cout<<b[i][5];
111             cout<<endl;
112         }
113         //puts("");
114     }
115     return 0;
116 }
View Code

 

高斯消元

bubuko.com,布布扣
 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 using namespace std;
11 #define N 100000
12 #define LL long long
13 #define INF 0xfffffff
14 const double eps = 1e-8;
15 const double pi = acos(-1.0);
16 const double inf = ~0u>>2;
17 int x[42][42],ans[32];
18 int gauss()
19 {
20     int i,j,k;
21     for(k = 0 ;k < 30 ; k++)//依次将第k列变换为0
22     {
23         i = k;
24         while(i<30&&x[i][k]==0) i++;
25         if(i!=k)//找出第一个k列不为0的行 与之交换  因为是01 一般的会找出最大的
26         {
27             for(j = 0 ; j <= 30 ; j++)
28             swap(x[k][j],x[i][j]);
29         }
30         //i++;
31         for(i = 0 ;i <30 ; i++)//所有行与第k行进行运算 
32         {
33             if(i==k||x[i][k]==0)
34             {
35                 continue;
36             }
37             for(j = 0 ;j <= 30 ; j++)
38             {
39                 x[i][j]^=x[k][j];//因为01矩阵的特殊性 直接异或就可以了
40             }
41         }
42     }
43     for(i = 0 ;i < 30 ;i++)
44     {
45         if(x[i][30])
46         {
47             for(j = 0 ; j < 30&&x[i][j]==0 ; j++);
48             if(j==30) return 0;
49             else ans[j] = x[i][30];//也是因为01矩阵的特殊性 免去了解一元方程的麻烦
50         }
51     }
52     return 1;
53 }
54 int main()
55 {
56     int i,j,n,kk=0;
57     cin>>n;
58     while(n--)
59     {
60         memset(ans,0,sizeof(ans));
61         memset(x,0,sizeof(x));
62         for(i =0 ;i < 30 ;i++)
63         {
64             scanf("%d",&x[i][30]);
65         }
66         for(i =0 ; i < 30 ;i++)//构造矩阵 行为开关 列为灯  一个开关可以控制5个灯
67         {
68             x[i][i] = 1;
69            if(i>5) x[i][i-6] = 1;
70            if(i%6>0) x[i][i-1] = 1;
71            if(i%6<5) x[i][i+1] = 1;
72            if(i+6<30) x[i][i+6] = 1;
73         }
74         /*for(i = 0 ;i < 30 ;i++)
75         {
76             int tx = i/6;
77             int ty = i%6;
78             x[i][i] = 1;
79             for(j = 0 ; j < 30 ; j++)
80             {
81                 int kx = j/6;
82                 int ky = j%6;
83                 if(abs(tx-kx)+abs(ty-ky)<=1)
84                 x[i][j] = 1;
85             }
86         }*/
87         gauss();
88         printf("PUZZLE #%d\n",++kk);
89         for(i = 0 ; i < 30 ;i++)
90         {
91             cout<<ans[i];
92             if((i+1)%6==0) puts("");
93             else cout<<" ";
94         }
95     }
96     return 0;
97 }
View Code

 

线代都忘干净了。。看了N多博客 及讲解 把上篇最简单的高斯消元入门题搞懂。下面贴几篇讲的不错的博客。

如果对线代没什么概念的话 还是先看下文库的概念及理论 文库讲解

对高斯消元的解析及例题 czyuan原创

高斯消元的模板 比较全的模板 包括无解 有解及多解  模板

然后是对此题详细的讲解 感谢这位 看了他的博客 才明白了这道题  poj1222详解

再大体说一下 这题构造出矩阵 套上模板就可以A了 对于初学,的确不知道怎么构造矩阵,什么叫构造矩阵,先从开关与灯的关系入手,每个开关可以控制5台灯,边上的另算,这样就可以构造出一个开关与灯的01矩阵 A (30*30) 题的目的就是让灯从初始状态变为全0 当然可以逆着来 从0 变为初始状态 所以把初始状态化成一个单位向量 输入为1 B[i] = 1  那就可以列出式子

AX=B X为所求。

高斯消元系列,布布扣,bubuko.com

高斯消元系列

原文:http://www.cnblogs.com/shangyu/p/3601241.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!