Poj--1222(数学,高斯消元)

2014-09-16 17:31:30

思路:高斯消元的经典问题,一开始没什么思路,看了别人的博客恍然大悟,搞了俩小时QAQ。把每个位置的状态都列为主元,从而得到30个方程。

  根据输入的数据构造增广列。写完后发现从1开始标号有点违和TAT。

 1 /*************************************************************************
 2     > File Name: 3359.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Mon 15 Sep 2014 08:04:27 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <queue>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std;
17 typedef long long ll;
18 const int INF = 1 << 29;
19 typedef int Matrix[35][35];
20 
21 int T;
22 Matrix stand;
23 
24 void Init(){
25     memset(stand,0,sizeof(stand));
26     for(int i = 1; i <= 30; ++i){
27         stand[i][i] = 1;
28         if(i % 6 != 1) stand[i][i - 1] = 1;
29         if(i % 6 != 0) stand[i][i + 1] = 1;
30         if(i > 6) stand[i][i - 6] = 1;
31         if(i + 6 <= 30) stand[i][i + 6] = 1;
32     }
33 }
34 
35 void Gauss(Matrix A){
36     int var,equ;
37     var = equ = 30;
38     int cot = 0;
39     for(int i = 1; i <= equ; ++i){ //枚举每个主元
40         int r = i;
41         for(int j = i + 1; j <= equ; ++j) if(A[j][i]){
42             r = j;
43             break;
44         }
45         if(r != i)
46             for(int j = 1; j <= var + 1; ++j) swap(A[i][j],A[r][j]);
47         for(int k = i + 1; k <= equ; ++k){ //消该主元下方的元
48             if(A[k][i]){
49                 for(int j = 1; j <= var + 1; ++j)
50                     A[k][j] ^= A[i][j];
51             }
52         }
53     }
54     for(int i = equ; i >= 1; --i)
55         for(int j = i + 1; j <= equ; ++j)
56             A[i][var + 1] ^= (A[i][j] && A[j][var + 1]);
57 }
58 
59 int main(){
60     Init();
61     scanf("%d",&T);
62     for(int t = 1; t <= T; ++t){
63         Matrix ans;
64         memcpy(ans,stand,sizeof(stand));
65         for(int i = 1; i <= 30; ++i)
66             scanf("%d",&ans[i][31]);
67         Gauss(ans);
68         printf("PUZZLE #%d\n",t);
69         for(int i = 1; i <= 30; ++i){
70                printf("%d",ans[i][31]);
71             if(i % 6) printf(" ");
72             else printf("\n");
73         }
74     }
75     return 0;
76 }

 

posted @ 2014-09-16 17:35  Naturain  阅读(154)  评论(0)    收藏  举报