POJ 1222 EXTENDED LIGHTS OUT (异或消元)

原创 2015年11月18日 00:04:12

分析:一共有30个开关,30个灯,设a[i][j]代表第j个开关对第i个灯的贡献,那么a[i][j]=1或者0,其中a[i][i]=1,周围4个灯的贡献为1,其他都是0,用x[i]表示第i个开关有无按下,c[i]表示第i个灯的初始状态,那么对于第i个灯,得到异或方程:

c[i] xor (a[i][0]x[0]) xor (a[i][1]x[1]) xor ... xor (a[i][29]x[29])=0(a[i][0]x[0]) xor (a[i][1]x[1]) xor ... xor (a[i][29]x[29])=0 xor c[i]

得到一个异或方程组,这个时候异或消元,找出方程组的解即可。

这里也不需要按照高斯消元来写(上一次我就是按照高斯消元写的。。。),详见代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define LL long long
#define FOR(i,x,y)  for(int i = x;i < y;++ i)
#define IFOR(i,x,y) for(int i = x;i > y;-- i)

using namespace std;

const int maxn = 30;

int a[maxn];
int n,mat[5][6],c[30];

void init(){
    FOR(i,0,5){
        FOR(j,0,6)  scanf("%d",&mat[i][j]),c[6*i+j] = 0^mat[i][j];
    }
    FOR(i,0,5){
        FOR(j,0,6){
            int u = i*6+j;
            a[u] = (1<<(30-u))^c[u];
            if(i > 0)   a[u] ^= (1<<(36-u));
            if(i < 4)   a[u] ^= (1<<(24-u));
            if(j > 0)   a[u] ^= (1<<(31-u));
            if(j < 5)   a[u] ^= (1<<(29-u));
        }
    }
}

int xorguass(int n){
    int row = 0;
    for(int i = 30;i >= 0;-- i){
        int j;
        for(j = row;j < n;++ j){
            if(a[j] & (1<<i))   break;
        }
        if(j != n){
            swap(a[j],a[row]);
            for(j = 0;j < n;++ j){
                if(j == row)    continue;
                if(a[j] & (1<<i))   a[j] ^= a[row];
            }
        }
        ++ row;
    }
    return row;
}

int ans[5][6];

void work(){
    int n = xorguass(30);
    FOR(i,n,30) a[i] = 0;
    FOR(i,0,30){
        ans[i/6][i%6] = a[i]%2;
    }
    FOR(i,0,5){
        FOR(j,0,5)  printf("%d ",ans[i][j]);
        printf("%d\n",ans[i][5]);
    }
}

int main()
{
    //freopen("test.in","r",stdin);
    int T,tCase = 0;    scanf("%d",&T);
    while(T--){
        printf("PUZZLE #%d\n",++tCase);
        init();
        work();
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ-1222 EXTENDED LIGHTS OUT(高斯消元)

题意: 给你一个5*6的矩阵,每个点上都有一个灯,按下f[i][j]的按钮,f[i][j]位置的灯的状态会改变,它上下左右的灯的状态也会改变(开变关,关变开)。 现在给出这个矩阵的初始状态,输出按下哪...
  • moringrain
  • moringrain
  • 2015年08月10日 14:19
  • 713

POJ 1222 Java: Extended lights out 枚举

题目描述:http://poj.org/problem?id=1222 本题使用到的算法是枚举法。要求得使灯全部熄灭的按开关方式,最简单的方法就是将30个开关的每一种状态都枚举一遍。但是这样...
  • u012340794
  • u012340794
  • 2016年02月25日 12:32
  • 318

poj 1222 EXTENDED LIGHTS OUT

Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons e...
  • Mr_Doublerun
  • Mr_Doublerun
  • 2016年09月05日 21:38
  • 88

POJ 1222 : EXTENDED LIGHTS OUT

http://poj.org/problem?id=1222 点灯问题,用遍历搜索空间的方法解。正如题目中所提到的几点,按下的顺序无关,每个灯最多只需按下一次。假设最终的按下位置为press矩阵,那...
  • Sprithy_Dream
  • Sprithy_Dream
  • 2012年04月25日 15:45
  • 206

POJ 1222 EXTENDED LIGHTS OUT

Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons eac...
  • u013810072
  • u013810072
  • 2014年08月26日 19:49
  • 338

poj(1222)——EXTENDED LIGHTS OUT

题意: 当前有一个6*5的矩形,然后输入中给出每个灯的状态,1表示当前灯是亮的,0表示灯是灭的。然后让你给出一种能把所有的灯都熄灭的方案,并输出之。其中输出的矩阵中1表示 按这个位置的灯,0表示不按...
  • ACMer_hades
  • ACMer_hades
  • 2016年03月15日 21:45
  • 425

POJ 1222 EXTENDED LIGHTS OUT

高斯消元 题意: 给你一个5*6的矩阵,每个点上都有一个灯,按下f[i][j]的按钮,f[i][j]位置的灯的状态会改变,它上下左右的灯的状态也会改变(开变关,关变开)。 现在给出这个矩阵的初始...
  • u010369794
  • u010369794
  • 2017年08月21日 15:53
  • 67

【POJ 1222】EXTENDED LIGHTS OUT

高斯消元解异或方程组方法介绍~
  • Regina8023
  • Regina8023
  • 2015年04月09日 00:04
  • 963

[POJ 1222] EXTENDED LIGHTS OUT

题目 http://acm.pku.edu.cn/JudgeOnline/problem?id=1222 描述 给你一个5行6列的矩阵分别表示30个灯,矩阵map[i][j]为...
  • qq_21110267
  • qq_21110267
  • 2015年02月15日 21:24
  • 437

EXTENDED LIGHTS OUT POJ - 1222

题意: 按下一个按钮,会不小心碰到与其邻接的按钮,每个按钮对应着一个灯泡, 现在给出灯泡情况,问如果操作可以将灯泡全部关掉 思路: 高斯消元基础题 消除到最后进行回溯求解 将灯泡进行编号,...
  • a7f650ebd327889c
  • a7f650ebd327889c
  • 2017年11月16日 17:30
  • 60
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1222 EXTENDED LIGHTS OUT (异或消元)
举报原因:
原因补充:

(最多只允许输入30个字)