• 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;
    }
  • 相关阅读:
    自动刷新页面
    超链接<A>链接到某个文档
    JS脚本的对话框
    表最后更新的标识列
    c#对象私有属性在重载Equals中的使用
    一个关于在Fedora下安装jdk的问题
    表格的行转列
    UNION和UNION ALL的区别
    关于使用存储过程的一些好处以及注意事项[转]
    SQL 外链接操作小结
  • 原文地址:https://www.cnblogs.com/staginner/p/2496036.html
Copyright © 2020-2023  润新知