Gauss poj 1222

原创 2016年05月30日 21:28:28

POJ 1222
0x11 1x12 1x13 0x14
1x21 0x22 0x23 1x24
0x31 0x32 1x33 0x34
1x41 0x42 0x43 1x44
-> simply
[ 0 0 0 0] [0 1 1 0] -> b[1][1] = x11^ x12^ x13 ^ a[1][1] -> b[1][1] ^ a[1][1] = x11^ x12^ x13 -> a[1][1] = x11 ^ x12 ^ x13
[ 0 0 0 0] [1 0 0 1] -> b[1][2] = x11^ x12^ x13 ^ x22 ^ a[1][2] -> b[1][2] ^ a[1][2] = x11^ x12^ x13 ^ x22 -> a[1][2] = x11 ^ x12 ^ x13 ^ x22
[ 0 0 0 0] [0 0 1 0] so a[2][2] = x21 ^ x22 ^ x32 ^ x21 ^ x23
[ 0 0 0 0] [1 0 0 1]
then -> a[num] = x[1]*Map[num][1] ^ … ^ x[16]*Map[num][16]
a(16*1) = Map(16*16)(* ^)x(16*1)
Gauss-> Map(16*17) -> cal x(16*1)
in this problem Gauss(equ = 30, var = 30) Map(30,31) -> x(30,1)
确定好每个a[i][j] 正好是 结果矩阵,再添30个方程,和关系矩阵即可

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
//0x11 1x12 1x13 0x14
//1x21 0x22 0x23 1x24
//0x31 0x32 1x33 0x34
//1x41 0x42 0x43 1x44
//-> simply
//[ 0 0 0 0] [0 1 1 0] -> b[1][1]  = x11^ x12^ x13 ^ a[1][1] -> b[1][1] ^ a[1][1] = x11^ x12^ x13 -> a[1][1] = x11 ^ x12 ^ x13
//[ 0 0 0 0] [1 0 0 1] -> b[1][2]  = x11^ x12^ x13 ^ x22 ^ a[1][2] ->  b[1][2] ^ a[1][2] = x11^ x12^ x13 ^ x22 -> a[1][2] = x11 ^ x12 ^ x13 ^ x22
//[ 0 0 0 0] [0 0 1 0]    so a[2][2] = x21 ^ x22 ^ x32 ^ x21 ^ x23
//[ 0 0 0 0] [1 0 0 1]
//then -> a[num]  = x[1]*Map[num][1] ^ ... ^ x[16]*Map[num][16]
//a(16*1) =  Map(16*16)(* ^)x(16*1)
//Gauss-> Map(16*17) -> cal x(16*1)
// in this problem Gauss(equ = 30, var = 30)  Map(30,31) -> x(30,1)
const int maxn = 50;
int a[maxn][maxn]; // zeng guang
int x[maxn] ; // ans_x
int free_x[maxn] ;
// 8 6 (6,2) (2,0)
inline int gcd(int a , int b) {
    return b == 0 ? a : gcd(b,a%b) ;
    /*int t ;
    while(b){
        t = b ;
        b = a%b ;
        a = t ;
    }
    return a;*/
}
inline int lcm(int a ,int b){
    return a/gcd(a,b)*b;
}
inline int Abs(int a ){
    return a > 0 ? a : -a;
}
void debug(int equ , int var){
    for(int i = 0 ; i < equ ; ++i){
        for(int j = 0 ;j <= var ; ++j){
            cout << a[i][j] << " " ;
        }
        cout << endl;
    }
}
int Gauss(int equ , int var) {
    int max_r ;
    for(int i = 0 ; i <= var ; ++i){
        free_x[i] = false ;
        x[i] = 0 ;
    }
    //cout << equ << " " << var << endl;
    int row , col ;
    for(row = 0 ,col = 0 ; row < equ && col < var ; ++row , ++col) {
        max_r = row ;
        for(int i = row+1 ; i < equ ; ++i){         // find the max element in this col
            if(Abs(a[max_r][col]) < Abs(a[i][col])) max_r = i;
        }
        if(max_r != row){
            for(int j = col ; j <= var ; ++j){  // change
                swap(a[max_r][j],a[row][j]) ;
            }
        }
        if(!a[row][col]) {                  // 0
            row--;
            continue ;
        }
        //debug(3,3) ;
        for(int i = row+1 ; i < equ ; ++i){
            if(a[i][col]){// sub a[i][col] -> 0
                  /*  int tmp = lcm(abs(a[i][col]),abs(a[row][col])) ;
                    int up = tmp/(abs(a[row][col])) ;
                    int down = tmp/(abs(a[i][col])) ;
                    //cout << tmp << " " << up << " " << down << endl;
                    if(a[i][col]*a[row][col]<0) up = -up ;
                for(int j = col ; j <= var; ++j){
                    a[i][j] = a[i][j]*down - a[row][j]*up ;
                }   */
                for(int j = 0 ; j <= var ; ++j){
                    a[i][j] ^= a[row][j] ;
                }
            }
        }
    //system("pause") ;
    }
    // col == var  , [row,equ) == all of 0000...a
    for(int i = row ; i < equ ; ++i){
        if(a[i][col] != 0) {
            return -1 ;         // no solve
        }
    }
    /* if(row < var){ //[row , equ -1 ] -> (000.000)  have free_x ,at least var - row . cal the x[]
            int free_index ;
        for(int i = row-1; i >= 0; --i){
            int free_num = 0 ;
            for(int j = i; j < var; ++j){
                if(a[i][j]&&(!free_x[j])) {
                    free_num++ ;
                    free_index = j ;
                }
            }
            if(free_num > 1) continue ; // free_x > 1 , can't solve
            // solve the free__index;
            int tmp = a[i][var] ;
            for(int j = i ; j < var ; ++j){
                if(a[i][j] && j != free_index) {
                    tmp -= a[i][j]*x[j] ;
                }
            }
            x[free_index] = tmp/a[i][free_index] ;      // solve the x of a[i][free_index] ;
            free_x[free_index] = true ;                 // solvable
        }
        return var - row ;
    }   */
    // only have one ans and must be the ans
    for(int i = equ-1 ; i >= 0 ; --i){
            bool tmp = a[i][var] ;
        /*for(int j = i+1 ; j < var ; ++j){
                if(a[i][j])
            tmp -= a[i][j]*x[j] ;
        }*/
        // if(tmp%a[i][i] != 0 )  double ans
        for(int j = i+1 ; j < var ; ++j){
            if(a[i][j])
                tmp ^= x[j] ;
        }
         x[i] = tmp ;
        //x[i] = tmp/a[i][i] ;
    }
    return 0;
}
void init(int var){
    for(int row=0; row<var; ++row){
        for(int col=0; col<var; ++col){
            a[row][col] = false;
            /*row-1>=0&&col-1>=0 ? a[row-1][col-1] = true : a[row-1][col-1] = false;
            row-1>=0 ? a[row-1][col] = true : a[row-1][col] = false;
            col+1<var ? a[row][col+1] = true : a[row][col+1] = false;
            col+1<var&&row+1<var ? a[row+1][col+1] = true : a[row+1][col+1] = false;*/
        }
    }
     for(int i = 0 ;i < 5 ; ++i){
        for(int j = 0 ;j < 6 ; ++j){
                int tmp = i*6+j ;
            if(i==0&&j==0) a[tmp][tmp+1] = a[tmp][tmp+6] = a[tmp][tmp] = true ;
            else if(i==0&&j==5) a[tmp][tmp] = a[tmp][tmp-1] = a[tmp][tmp+6] = true ;
            else if(i==4&&j==0) a[tmp][tmp] = a[tmp][tmp-6] = a[tmp][tmp+1] = true ;
            else if(i==4&&j==5) a[tmp][tmp] = a[tmp][tmp-6] = a[tmp][tmp-1] = true ;
            else if(j==0) a[tmp][tmp-6] = a[tmp][tmp] = a[tmp][tmp+6] = a[tmp][tmp+1] = true ;
            else if(j==5) a[tmp][tmp-6] = a[tmp][tmp] = a[tmp][tmp+6] = a[tmp][tmp-1] = true ;
            else if(i==0) a[tmp][tmp+1] = a[tmp][tmp] = a[tmp][tmp+6] = a[tmp][tmp-1] = true ;
            else if(i==4) a[tmp][tmp+1] = a[tmp][tmp] = a[tmp][tmp-6] = a[tmp][tmp-1] = true ;
            else a[tmp][tmp] = a[tmp][tmp+6] = a[tmp][tmp-6] = a[tmp][tmp+1] = a[tmp][tmp-1] = true ;
        }
    }
//    debug(var,var) ;
//    system("pause") ;
    return ;
}
int main(){
    int t ,cas = 1;
    cin >> t ;
    while(t--){
        int var = 5*6 ;
        init(var) ;
        for(int i=0; i<5*6; ++i){
            cin >> a[i][var] ;
        }
       // debug(30,30) ;
       int flag = Gauss(var,var) ;
       if(!flag){
            char ch[] = "PUZZLE #";
            printf("%s%d\n",ch,cas++) ;
            for(int i = 0 , cnt = 1 ;i < 30 ; ++i,cnt++){
                cnt%6 ? printf("%d ",x[i]) : printf("%d\n",x[i]) ;
            }
       }
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ 1222 熄灯游戏

熄灯游戏, 枚举
  • morgan_xww
  • morgan_xww
  • 2010年08月10日 13:58
  • 4066

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

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

POJ 1222 高斯消元法

CXLOVE的第一篇博文,先来一个水题 开灯关灯问题,5*6的灯阵,将每一个位置上的状态看做一个变元,30个变元,列出30个异或方程,高斯消元解方程即可 N年前就做过这题,当时是位运算枚举+递推 ...
  • ACM_cxlove
  • ACM_cxlove
  • 2012年03月30日 15:13
  • 5523

poj 1222 EXTENDED LIGHTS OUT(高斯消元)

http://poj.org/problem?id=1222 先贴一个链接 http://blog.csdn.net/u013081425/article/details/24248247 枚举...
  • u013081425
  • u013081425
  • 2014年04月25日 09:12
  • 2001

pku1222(高斯消元1)

http://162.105.81.212/JudgeOnline/problem?id=1222题意:有一个5*6的方阵,每个位置都表示按钮和灯,1表示亮,0表示灭。每当按下(i,j)时,(i,j)...
  • shiren_Bod
  • shiren_Bod
  • 2010年07月26日 17:12
  • 4042

poj 1222 高斯消元详解

题意 有一个5 * 6的矩阵,每个位置表示灯,1表示灯亮,0表示灯灭。 然后如果选定位置i,j点击,则位置i,j和其上下左右的灯的状态都会反转。 现在要你求出一个5 * 6的矩阵,1表示这个灯被...
  • u013508213
  • u013508213
  • 2015年08月03日 22:34
  • 2351

【POJ 1222】EXTENDED LIGHTS OUT

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

POJ 1222(Gauss消元xor版)

EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 518...
  • nike0good
  • nike0good
  • 2013年02月06日 17:04
  • 1203

poj 1222 EXTENDED LIGHTS OUT(Gauss)

题目:EXTENDED LIGHTS OUT 思路:30个变元,30个异或方程,把czyuan神的Gauss模板改一改 #include #include #include #include...
  • shiyuankongbu
  • shiyuankongbu
  • 2013年04月25日 19:59
  • 543

高斯消元几道入门题总结POJ1222&&POJ1681&&POJ1830&&POJ2065&&POJ3185

最近在搞高斯消元,反正这些题要么是我击败了它们,要么就是这些题把我给击败了。现在高斯消元专题部分还有很多题,先把几道很简单的入门题总结一下吧。 专题:http://acm.hust.edu.cn/vj...
  • u010885899
  • u010885899
  • 2015年11月11日 15:30
  • 630
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Gauss poj 1222
举报原因:
原因补充:

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