叩问最终要叫所有的灯关掉的操作矩阵(1意味着该岗位的灯操作了),问最终要使得所有的灯关掉的操作矩阵(1表示该地方的灯操作了),对一个岗位操作(0-&gt

EXTENDED LIGHTS
OUT

EXTENDED LIGHTS
OUT

poj 1222 EXTENDED LIGHTS OUT,poj1222

EXTENDED LIGHTS OUT

题意:给一个5*6之01矩阵,对一个岗位操作(0->1开灯或1->0关灯)会影响到(包括好)周边灯状态反转。问最后使使得所有的灯关掉的操作矩阵(1象征该职务的灯操作了)

提示:01矩阵,题目为了就是操作简单坏就是相当给尚未操作,然则还有隐含的意思就是是即时即便是一个异或操作(就是同mod2);对于01矩阵加上操作矩阵得到0矩阵,可知所效能的矩阵和原矩阵相同;(操作矩阵:如对(0,0)操作就异常给长单独生左上角有3只1底矩阵,不过把这一个矩阵转化为一个维度为30之向量格局,有30栈灯所以下是一个30*30之矩阵)这是高斯消元列方程的底子;

高斯消元法:最着重之凡设想开构造出一个30*30之意矩阵,第i排数字被(列号0~29意味灯的号)1意味第i杯灯操作会影响及1所对应的行号的灯火,存储于增广矩阵a[][]中;

所谓增广矩阵就是空洞出单含方程组的全面与结果的矩阵(简化书写)。这样第i盏灯最终的状态a[i][30]
= Σ(a[i][j]*x[j])(0 <= j <
30)。这即使是干吗在结尾化成了直达三角之后怎么是对准行向量操作的原故;(a[i][j]
&&
x[j]代表第j盏灯操作会影响及第i海灯,并且第j海灯是起初的。还有一个前提就是是a[i][i]
= 1,所以x[i] = a[i][var])

横流:在高斯消元列方程转移到矩阵时,最好直接扣每一个周详与变量之间的呼应关系,而未是为此行向量与列向量来拘禁。

 

 

图片 1#include<iostream>
#include<cstdio> #include<cstring>
#include<string.h> #include<algorithm>
#include<map> #include<queue> #include<vector>
#include<cmath> #include<stdlib.h> #include<time.h>
using namespace std; #define rep0(i,l,r) for(int i = (l);i <
(r);i++) #define rep1(i,l,r) for(int i = (l);i <= (r);i++) #define
rep_0(i,r,l) for(int i = (r);i > (l);i–) #define rep_1(i,r,l)
for(int i = (r);i >= (l);i–) #define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a)) int dir[2][4] =
{{0,1,0,-1},{1,0,-1,0}}; int a[35][35]; int equ,var; int x[35];
int Guass() { int i,j,k,free_var = 0; rep0(i,0,equ){ int mx = i;
rep0(j,i+1,equ) if(abs(a[j][i]) > abs(a[mx][i])) mx = j;
if(a[mx][i] == 0){ free_var++; continue; } if(mx != i)
rep1(k,i,var) swap(a[i][k],a[mx][k]); rep0(j,i+1,equ){
if(a[j][i]){ //第j杯子灯为谋面对第i盏灯暴发震慑; rep1(k,i,var)
a[j][k] ^= a[i][k]; } } } if(free_var != 0) return free_var;
rep_1(i,var-1,0){ x[i] = a[i][var]; rep0(j,i+1,equ) x[i] ^=
(a[i][j] && x[j]); //第j独灯会影响到第i海灯,同时第j海灯为会师显示。 }
} void init() { int i,j,k; rep0(i,0,5) rep0(j,0,6){ int x = i*6+j;
a[x][x] = 1; rep0(k,0,4){ int nx = i + dir[0][k] ,ny = j +
dir[1][k]; int pos = nx*6+ny; if(nx < 0 || nx >= 5 || ny <
0 || ny >= 6) continue; a[pos][x] = 1;
//本来是本着如之矩阵,因为影响是相的,可是写成[x][pos]思维就非平等了
} } } int main() { int T,kase = 1,i; cin>>T; while(T–){
MS0(x);MS0(a); rep0(i,0,30) scanf(“%d”,&a[i][30]); init(); equ = var
= 30; Guass(); printf(“PUZZLE #%d\n”,kase++); rep0(i,0,30)
printf(“%d%c”,x[i],(i+1)%6?’ ‘:’\n’); } return 0; } View Code

 

http://www.bkjia.com/Cyy/1098068.htmlwww.bkjia.comtruehttp://www.bkjia.com/Cyy/1098068.htmlTechArticlepoj 1222 EXTENDED LIGHTS OUT,poj1222 EXTENDED
LIGHTS OUT 题意:给一个5*6之 01
矩阵,对一个职务操作(0-1开灯或1-0关灯)会潜移默化到(包括好)周边灯状…

题意:给一个5*6之01矩阵,对一个职务操作(0->1开灯或1->0关灯)会影响到(包括好)周边灯状态反转。问最终使让所有的灯关掉的操作矩阵(1意味着该岗位的灯操作了)

题意:给一个5*6之01矩阵,对一个岗位操作(0->1开灯或1->0关灯)会影响到(包括好)周边灯状态反转。问最后使使所有的灯关掉的操作矩阵(1代表该职务的灯操作了)

指示:01矩阵,题目让了就是操作简单差就一定给尚未操作,不过还有隐含的意思就是是这就是是一个异或操作(就是与mod2);对于01矩阵加上操作矩阵得到0矩阵,可知所效能的矩阵和原来矩阵相同;(操作矩阵:如对(0,0)操作就分外给长单独出左上角有3个1之矩阵,可是拿此矩阵转化为了一个维度为30的向量模式,有30栈灯所以下是一个30*30的矩阵)这是高斯消元列方程的底子;

提拔:01矩阵,题目为了即操作简单浅就是非凡给无操作,可是还有隐含的意就是是就便是一个异或操作(就是跟mod2);对于01矩阵加上操作矩阵得到0矩阵,可知所效率的矩阵和原来矩阵相同;(操作矩阵:如对(0,0)操作就相当给长单独发左上角有3个1之矩阵,不过将这矩阵转化为了一个维度为30底向量格局,有30栈灯所以下是一个30*30的矩阵)那是高斯消元列方程的底子;

高斯消元法:最关键的凡使想开构造出一个30*30底来意矩阵,第i排列数字中(列号0~29代表灯的标)1意味着第i盏灯操作会影响至1所对应之行号的灯火,存储在增广矩阵a[][]中;

高斯消元法:最关键的凡一旦想开构造出一个30*30的图矩阵,第i排数字中(列号0~29意味着灯的标注)1意味着第i杯灯操作会影响及1所对应的行号的灯,存储在增广矩阵a[][]中;

所谓增广矩阵就是空虚出单纯含方程组的周到与结果的矩阵(简化书写)。这样第i海灯最后之状态a[i][30]
= Σ(a[i][j]*x[j])(0 <= j <
30)。这就是怎在结尾化成了达到三角之后怎么是指向行向量操作的缘由;(a[i][j] &&
x[j]代表第j杯灯操作会影响及第i杯灯,并且第j杯子灯是起之。还有一个前提就是是a[i][i]
= 1,所以x[i] = a[i][var])

所谓增广矩阵就是空虚出单含方程组的周全与结果的矩阵(简化书写)。这样第i海灯最后之状态a[i][30]
= Σ(a[i][j]*x[j])(0 <= j <
30)。那就是是为啥当结尾化成了达到三角之后怎么是本着行向量操作的来由;(a[i][j] &&
x[j]意味着第j杯灯操作会影响到第i杯灯,并且第j杯子灯是起始之。还有一个前提就是是a[i][i]
= 1,所以x[i] = a[i][var])

流动:在高斯消元列方程转移到矩阵时,最好直接扣各一个周到与变量之间的相应关系,而休是由此行向量与列向量来拘禁。

横流:在高斯消元列方程转移到矩阵时,最好直接扣每一个周全与变量之间的照应关系,而不是为此行向量与列向量来拘禁。

 

 

 

 

图片 2图片 3

图片 4图片 5

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
int dir[2][4] = {{0,1,0,-1},{1,0,-1,0}};
int a[35][35];
int equ,var;
int x[35];
int Guass()
{
    int i,j,k,free_var = 0;
    rep0(i,0,equ){
        int mx = i;
        rep0(j,i+1,equ)
            if(abs(a[j][i]) > abs(a[mx][i]))  mx = j;
        if(a[mx][i] == 0){
            free_var++;
            continue;
        }
        if(mx != i)
            rep1(k,i,var)
                swap(a[i][k],a[mx][k]);
        rep0(j,i+1,equ){
            if(a[j][i]){    //第j盏灯也会对第i盏灯产生影响;
                rep1(k,i,var)
                    a[j][k] ^= a[i][k];
            }
        }
    }
    if(free_var != 0) return free_var;
    rep_1(i,var-1,0){
        x[i] = a[i][var];
        rep0(j,i+1,equ)
            x[i] ^= (a[i][j] && x[j]);  //第j个灯会影响到第i盏灯,同时第j盏灯也会亮。
    }
}
void init()
{
    int i,j,k;
    rep0(i,0,5)
        rep0(j,0,6){
            int x = i*6+j;
            a[x][x] = 1;
            rep0(k,0,4){
                int nx = i + dir[0][k] ,ny = j + dir[1][k];
                int pos = nx*6+ny;
                if(nx < 0 || nx >= 5 || ny < 0 || ny >= 6) continue;
                a[pos][x] = 1;  //本来是对称的矩阵,因为影响是相互的,但是写成[x][pos]思想就不一样了
            }
        }
}
int main()
{
    int T,kase = 1,i;
    cin>>T;
    while(T--){
        MS0(x);MS0(a);
        rep0(i,0,30) scanf("%d",&a[i][30]);
        init();
        equ = var = 30;
        Guass();
        printf("PUZZLE #%d\n",kase++);
        rep0(i,0,30)
            printf("%d%c",x[i],(i+1)%6?' ':'\n');
    }
    return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
int dir[2][4] = {{0,1,0,-1},{1,0,-1,0}};
int a[35][35];
int equ,var;
int x[35];
int Guass()
{
    int i,j,k,free_var = 0;
    rep0(i,0,equ){
        int mx = i;
        rep0(j,i+1,equ)
            if(abs(a[j][i]) > abs(a[mx][i]))  mx = j;
        if(a[mx][i] == 0){
            free_var++;
            continue;
        }
        if(mx != i)
            rep1(k,i,var)
                swap(a[i][k],a[mx][k]);
        rep0(j,i+1,equ){
            if(a[j][i]){    //第j盏灯也会对第i盏灯产生影响;
                rep1(k,i,var)
                    a[j][k] ^= a[i][k];
            }
        }
    }
    if(free_var != 0) return free_var;
    rep_1(i,var-1,0){
        x[i] = a[i][var];
        rep0(j,i+1,equ)
            x[i] ^= (a[i][j] && x[j]);  //第j个灯会影响到第i盏灯,同时第j盏灯也会亮。
    }
}
void init()
{
    int i,j,k;
    rep0(i,0,5)
        rep0(j,0,6){
            int x = i*6+j;
            a[x][x] = 1;
            rep0(k,0,4){
                int nx = i + dir[0][k] ,ny = j + dir[1][k];
                int pos = nx*6+ny;
                if(nx < 0 || nx >= 5 || ny < 0 || ny >= 6) continue;
                a[pos][x] = 1;  //本来是对称的矩阵,因为影响是相互的,但是写成[x][pos]思想就不一样了
            }
        }
}
int main()
{
    int T,kase = 1,i;
    cin>>T;
    while(T--){
        MS0(x);MS0(a);
        rep0(i,0,30) scanf("%d",&a[i][30]);
        init();
        equ = var = 30;
        Guass();
        printf("PUZZLE #%d\n",kase++);
        rep0(i,0,30)
            printf("%d%c",x[i],(i+1)%6?' ':'\n');
    }
    return 0;
}

View Code

View Code

 

 

相关文章