• 「ZOJ 1354」Extended Lights Out「高斯消元」


    题意:给定一个(5 imes 6)的棋盘的(01)状态,每次操作可以使它自己和周围四个格子状态取反,求如何操作,输出一个(01)矩阵

    题解:这题可以通过枚举第一行的状态然后剩下递推来做,但是这里还是写一种好理解的高斯消元解异或方程组的方法。

    对于每个格子列一个方程,未知数就是要求的答案矩阵,系数的话把它周围的设为1,其他设为0。然后右边的常数项为它本来的状态。然后就高斯消元嘛。

    我用了bitset优化,实际上可能unsigned int或者long long也可以。

    #include <algorithm>
    #include <bitset>
    #include <cstdio>
    using namespace std;
    
    const int n = 5;
    const int m = 6;
    const int N = 34;
    const int dx[] = {0, 1, 0, -1, 0};
    const int dy[] = {0, 0, 1, 0, -1};
    
    int f[N];
    bitset<N> a[N];
    
    int pos(int x, int y) {
        return (x - 1) * m + y;
    }
    
    void gauss(int n) {
        for(int i = 1, j; i <= n; i ++) {
            for(int k = i; k <= n; k ++) if(a[k][i]) j = k, k = n;
            if(i != j) swap(a[i], a[j]);
            for(j = i + 1; j <= n; j ++) if(a[j][i]) a[j] ^= a[i];
        }
        for(int i = n - 1; i >= 1; i --)
            for(int j = i + 1; j <= n; j ++)
                if(a[j][n + 1] && a[i][j]) a[i][n + 1] = !a[i][n + 1];
    }
    
    int main() {
        int test; scanf("%d", &test);
        for(int t = 1; t <= test; t ++) {
            for(int i = 1; i <= n; i ++)
                for(int j = 1; j <= m; j ++)
                    scanf("%d", &f[pos(i, j)]);
            for(int i = 1; i <= n; i ++)
                for(int j = 1; j <= m; j ++) {
                    int p = pos(i, j); a[p].reset();
                    a[p][n * m + 1] = f[p];
                    for(int k = 0; k < 5; k ++) {
                        int x = i + dx[k], y = j + dy[k];
                        if(x >= 1 && x <= n && y >= 1 && y <= m) {
                            a[p][pos(x, y)] = 1;
                        }
                    }
                }
            gauss(n * m);
            printf("PUZZLE #%d
    ", t);
            for(int i = 1; i <= n; i ++)
                for(int j = 1; j <= m; j ++)
                    printf("%d%c", (int) a[pos(i, j)][n * m + 1], " 
    "[j == m]);
        }
        return 0;
    }
    
    
  • 相关阅读:
    关闭Pinterest通知
    android——创建camera应用(译)
    Android样式——Styles
    Android Fragment学习(一)
    Win32汇编环境配置
    关于微信检测SDK应用的原理浅析(iOS)
    iOS的Mantle实战
    Objective-C运行时的一些技巧
    Autolayout入门教程
    基于RAC的通用TableView
  • 原文地址:https://www.cnblogs.com/hongzy/p/10356538.html
Copyright © 2020-2023  润新知