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;
}
posted on 2012-05-11 14:30  Staginner  阅读(254)  评论(0编辑  收藏  举报