【高斯消元】 POJ 1222 EXTENDED LIGHTS OUT
题意:有一个5*6的矩阵,每个位置都表示按钮和灯,1表示亮,0表示灭。每当按下一个位置的按钮,它和它周围灯的状态全部翻转,问在这样的一个方阵中按下哪些按钮可以把整个方阵都变成灭的,这时1表示按了,0表示没按
代码:
#include <cstdio> #include <cstring> #include <vector> #include <cmath> #include <algorithm> using namespace std; const int MAX_N = 31; const double EPS = 1e-8; typedef vector<int> vec; typedef vector<vec> mat; void gauss (mat a, vec &v) { int i,j,k; for (k=0;k<30;k++) { i=k; for (;i<30;i++) if (a[i][k]!=0) break; for (j=0;j<=30;j++) swap (a[k][j],a[i][j]); for (i=0;i<30;i++) if (k!=i && a[i][k]) for (j=0;j<=30;j++) a[i][j]=a[k][j]^a[i][j]; } for (i=0;i<30;i++) v[i]=a[i][30]; } mat a(MAX_N, vec(MAX_N)); vec v(MAX_N); int main () { int T; scanf("%d",&T); for (int Cas=1;Cas<=T;Cas++) { for (int i = 0; i < MAX_N; ++i) for (int j = 0; j < MAX_N; ++j) a[i][j] = 0; for (int i = 0; i < 30; ++i) { scanf("%d", &a[i][30]); v[i] = 0; } for (int i = 0; i < 30; ++i) { a[i][i] = 1; if (i%6 != 0) a[i-1][i] = 1; if (i%6 != 5) a[i+1][i] = 1; if (i > 5) a[i-6][i] = 1; if (i < 24) a[i+6][i] = 1; } gauss(a, v); printf ("PUZZLE #%d\n",Cas); for (int i = 0; i < 30; ++i) printf (i%6==5?"%d\n":"%d ",v[i]); } return 0; }