poj 1222 EXTENDED LIGHTS OUT 高斯消元
题目就是给你一些灯, 点击一个灯, 就会改变它自身和它四周的所有的灯的状态。 给你所有灯的初始状态, 要你输出所有灯的点击情况, 1代表点击, 0代表不点击。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define mem(a) memset(a, 0, sizeof(a)) 4 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; 5 int a[35][35], ans[35]; 6 void gauss() { 7 for(int k = 0; k<30; k++) { 8 int i = k; 9 while(i<30&&!a[i][k]) 10 i++; 11 if(i>k) { 12 for(int r = 0; r<=30; r++) 13 swap(a[i][r], a[k][r]); 14 } 15 for(int i = 0; i<30; i++) { 16 if(i!=k && a[i][k]) { 17 for(int j = 0; j<=30; j++) { 18 a[i][j] ^= a[k][j]; 19 } 20 } 21 } 22 } 23 for(int i = 0; i<30; i++) { 24 if(a[i][30]) { 25 int j = 0; 26 while(j<30&&!a[i][j]) 27 j++; 28 ans[j] = a[i][30]; 29 } 30 } 31 } 32 int main() 33 { 34 int t; 35 cin>>t; 36 for(int cnt = 1; cnt<=t; cnt++) { 37 mem(a); 38 mem(ans); 39 for(int i = 0; i<30; i++) { 40 scanf("%d", &a[i][30]); 41 } 42 for(int i = 0; i<30; i++) 43 a[i][i] = 1; 44 for(int i = 0; i<5; i++) { 45 for(int j = 0; j<6; j++) { 46 for(int k = 0; k<4; k++) { 47 int x = i+dir[k][0]; 48 int y = j+dir[k][1]; 49 if(x>=0&&x<5&&y>=0&&y<6) { 50 a[i*6+j][x*6+y] = 1; 51 } 52 } 53 } 54 } 55 gauss(); 56 printf("PUZZLE #%d\n", cnt); 57 for(int i = 0; i<30; i++) { 58 int x = i/6; 59 int y = i%6; 60 a[x][y] = ans[i]; 61 } 62 for(int i = 0; i<5; i++) { 63 printf("%d", a[i][0]); 64 for(int j = 1; j<6; j++) { 65 printf(" %d", a[i][j]); 66 } 67 puts(""); 68 } 69 } 70 }