POJ 1222 EXTENDED LIGHTS OUT(高斯消元)

forever97 posted @ 2016年7月29日 15:01 in 数学-高斯消元 with tags 高斯消元 , 712 阅读

 

【题目链接】 http://poj.org/problem?id=1222

 

【题目大意】

     给出一个6*5的矩阵,由0和1构成,要求将其全部变成0,每个格子和周围的四个格子联动,就是说,如果一个格子变了数字,周围四格都会发生变化,变化即做一次与1的异或运算,输出每个格子的操作次数。

 

【题解】

    高斯消元练手题,对于每个格子的最终情况列一个方程,一共三十个方程三十个未知数,用高斯消元求解即可。

 

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int T,p[35][35],Cas=1;
void Gauss(int n,int m){
    int i,j,k,h,w;
    for(i=j=1;j<m;j++,w=0){
        for(k=i;k<=n;k++)if(p[k][j])w=k;
        if(w){
            for(k=j;k<=m;k++)swap(p[i][k],p[w][k]);
            for(k=1;k<=n;k++)if(k!=i&&p[k][j]){
                for(h=j;h<=m;h++)p[k][h]^=p[i][h];
            }i++;
        }if(i>n)break;
    }
}
int main(){
    scanf("%d",&T);
    while(T--){
        memset(p,0,sizeof(p));
        for(int i=1;i<=30;i++){
            p[i][i]=1;
            if(i>6)p[i-6][i]=1;
            if(i<25)p[i+6][i]=1;
            if(i%6!=1)p[i-1][i]=1;
            if(i%6!=0)p[i+1][i]=1;
        }for(int i=1;i<=30;i++){scanf("%d",&p[i][31]);}
        Gauss(30,31);
        printf("PUZZLE #%d\n",Cas++);
        for(int i=1;i<=30;i++){
            printf("%d",p[i][31]);
            if(i%6==0)puts("");
            else printf(" "); 
        }
    }return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter