标签:
Description
Input
Output
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 6 using namespace std; 7 8 int f[6][7],ans[6][7],ga[101][101],cnt=0; 9 10 void print() 11 { 12 cnt++; 13 printf("PUZZLE #%d\n",cnt); 14 for(int i=1;i<=5;i++) 15 { 16 for(int j=1;j<=6;j++) 17 printf("%d ",ans[i][j]); 18 printf("\n"); 19 } 20 } 21 22 void Solve() 23 { 24 for(int i=30;i>=1;i--) 25 { 26 int x=i/6+1,y=i%6; 27 if(!y) y+=6,x--; 28 ans[x][y]=ga[i][31]; 29 for(int j=i+1;j<=30;j++) 30 if(ga[i][j]){ 31 int x1=j/6+1,y1=j%6; 32 if(!y1) y1+=6,x1--; 33 ans[x][y]=ans[x][y]^ans[x1][y1]; 34 } 35 } 36 } 37 38 void swapp(int l,int r) 39 { 40 for(int i=1;i<=31;i++) 41 swap(ga[l][i],ga[r][i]); 42 } 43 44 void find(int n) 45 { 46 for(int i=n+1;i<=30;i++) 47 if(ga[i][n]){swapp(i,n);return;} 48 } 49 50 void Guass() 51 { 52 for(int i=2;i<=30;i++)//消第几个元 53 { 54 if(!ga[i-1][i-1])find(i-1); 55 if(!ga[i-1][i-1])continue; 56 for(int j=i;j<=30;j++)//第几个方程 57 { 58 if(!ga[j][i-1])continue; 59 for(int k=i;k<=31;k++)//方程的第几项 60 ga[j][k]=ga[j][k]^ga[i-1][k]; 61 } 62 } 63 Solve(); 64 } 65 66 void set() 67 { 68 for(int i=1;i<=5;i++) 69 for(int j=1;j<=6;j++){ 70 ga[(i-1)*6+j][31]=f[i][j]; 71 ga[(i-1)*6+j][(i-1)*6+j]=1; //自己和上下左右是对自己有影响的点 72 if(j!=1) ga[(i-1)*6+j][(i-1)*6+j-1]=1; 73 if(j!=6) ga[(i-1)*6+j][(i-1)*6+j+1]=1; 74 if(i!=5) ga[(i-1)*6+j][i*6+j]=1; 75 if(i!=1) ga[(i-1)*6+j][(i-2)*6+j]=1; 76 } 77 return; 78 } 79 80 int main() 81 { 82 int T; 83 scanf("%d",&T); 84 while(T--) 85 { 86 for(int i=1;i<=5;i++) 87 for(int j=1;j<=6;j++) 88 scanf("%d",&f[i][j]); 89 set(); 90 Guass(); 91 print(); 92 memset(f,0,sizeof(f)); 93 memset(ga,0,sizeof(ga)); 94 memset(ans,0,sizeof(ans)); 95 } 96 return 0; 97 }
【高斯消元】Poj 1222:EXTENDED LIGHTS OUT
标签:
原文地址:http://www.cnblogs.com/tuigou/p/4635443.html