zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    回顾初心
    团队作业6(代码复审+事后诸葛亮)
    Alpha阶段项目复审(鸽牌开发小分队)
    事后诸葛亮(鸽牌开发小分队)
    团队作业5
    第七篇Scrum冲刺博客
    第六篇Scrum冲刺博客
    第五篇Scrum冲刺博客
    第四篇Scrum冲刺博客
    第三篇Scrum冲刺博客
  • 原文地址:https://www.cnblogs.com/staginner/p/2496036.html
Copyright © 2011-2022 走看看