POJ 1222 EXTENDED LIGHTS OUT

POJ_1222

    第一次接触高斯消元的题目,基本算是仿写出来的。由于题目没有说无解,也没有用special judge,所以应该按有唯一解的情况去做就可以了。

    当然这个题目也可以用枚举第一行的操作+搜索的办法去解,一些思路可以参考我的POJ_1753的解题报告:http://www.cnblogs.com/staginner/archive/2011/10/29/2228784.html

#include<stdio.h>

#include<string.h>

#include<iostream>

#define MAXD 35

using namespace std;

int dx[] = {0, -1, 1, 0, 0}, dy[] = {0, 0, 0, -1, 1};

int mat[MAXD][MAXD], ans[MAXD];

void init()

{

    int i, j, k, x, y;

    memset(mat, 0, sizeof(mat));

    for(i = 0; i < 30; i ++)

        scanf("%d", &mat[i][30]);

    for(i = 0; i < 5; i ++)

        for(j = 0; j < 6; j ++)

            for(k = 0; k < 5; k ++)

            {

                x = i + dx[k], y = j + dy[k];

                if(x >= 0 && x < 5 && y >= 0 && y < 6)

                    mat[i * 6 + j][x * 6 + y] = 1;

            }

}

void gauss()

{

    int i, j, k;

    for(i = 0; i < 30; i ++)

    {

        if(mat[i][i] == 0)

        {

            for(j = i + 1; j < 30; j ++)

                if(mat[j][i])

                {

                    for(k = i; k <= 30; k ++)

                        swap(mat[i][k], mat[j][k]);

                }

        }

        for(j = i + 1; j < 30; j ++)

            if(mat[j][i])

            {

                for(k = i; k <= 30; k ++)

                    mat[j][k] ^= mat[i][k];

            }

    }

}

void solve()

{

    int i, j;

    gauss();

    for(i = 29; i >= 0; i --)

    {

        ans[i] = mat[i][30];

        for(j = i + 1; j < 30; j ++)

            ans[i] ^= mat[i][j] * ans[j];

    }

    for(i = 0; i < 5; i ++)

    {

        printf("%d", ans[i * 6]);

        for(j = 1; j < 6; j ++)

            printf(" %d", ans[i * 6 + j]);

        printf("\n");

    }

}

int main()

{

    int t, tt;

    scanf("%d", &t);

    for(tt = 0; tt < t; tt ++)

    {

        init();

        printf("PUZZLE #%d\n", tt + 1);

        solve();

    }

    return 0;

}

你可能感兴趣的:(extend)