poj 1222 EXTENDED LIGHTS OUT(高斯消元)

来源:互联网 发布:复旦大学香港大学知乎 编辑:程序博客网 时间:2024/06/07 00:31

题解:http://blog.csdn.net/shiren_Bod/article/details/5766907
这题直接枚举第一行可行,因为第一行确定了,下边就都确定了。
但是是来练习高斯消元的,表示并不会构造方程。题解中讲的比较详细,看了几遍看懂了,感觉线代白学了。。模板是kuangbin大佬的模板。每次计算时选取绝对值最大的那一行来消元,是因为这样计算出结果会更精确。书上写的,不知道为啥。虽然对这题来说没什么卵用。

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int MAXN = 50;int g[MAXN][MAXN];int res[MAXN],equ,var;void init(){    memset(g,0,sizeof(g));    equ = var = 30;    for(int i = 0; i < 5; ++i)    {        //每次构造一个列向量        for(int j = 0; j < 6; ++j)        {            int t = i*6+j;            g[t][t] = 1;            if(i > 0) g[(i-1)*6+j][t] = 1;            if(i < 4) g[(i+1)*6+j][t] = 1;            if(j > 0) g[i*6+j-1][t] = 1;            if(j < 5) g[i*6+j+1][t] = 1;        }    }}void Gauss(){    int i,j,k,maxR,col,temp;    for(k = 0,col = 0; k < equ && col < var; ++k,++col)    {        maxR = k;        //找到行首绝对值最大的那一行        for(int i = k+1; i < equ; ++i)            if(abs(g[i][col]) > abs(g[maxR][col]))                maxR = i;        if(maxR != k)            for(j = col; j < var+1; ++j)                swap(g[k][j], g[maxR][j]);        //这是没有主元的列        if(g[k][col] == 0)        {            k--;            continue;        }        //主元下方的元素全部边为0        for(i = k+1; i < equ; ++i)        {            if(g[i][col] != 0)            {                for(j = col; j < var+1; ++j)                    g[i][j] ^= g[k][j];            }        }    }    //回带求解    for(i = var-1; i >= 0; --i)    {        res[i] = g[i][var];        for(j = i+1; j < var; ++j)            res[i] ^= (g[i][j]&&res[j]);    }}int main(){    int t,cnt = 0;    scanf("%d",&t);    while(t--)    {        init();        for(int i = 0; i < 30; ++i)            scanf("%d",&g[i][30]);        Gauss();        printf("PUZZLE #%d\n",++cnt);        for(int i = 0; i < 30; ++i)        {            printf("%d ",res[i]);            if((i+1)%6 == 0) puts("");        }    }    return 0;}
原创粉丝点击