【高斯消元】 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;
}
View Code

 

posted @ 2015-08-16 19:19  mithrilhan  阅读(173)  评论(0编辑  收藏  举报