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 }

浙公网安备 33010602011771号