POJ 1681 Painter's Problem [高斯消元XOR]

同上题


需要判断无解

需要求最小按几次,正确做法是枚举自由元的所有取值来遍历变量的所有取值取合法的最小值,然而听说数据太弱自由元全0就可以就水过去吧....

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bitset>
using namespace std;
const int N=230;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
int n,t;
bitset<N> a[N];
void ini(){
    for(int i=1;i<=n;i++) a[i].reset();
}
char s[N];
void Gauss(){
    int now=1;
    for(int i=1;i<=n;i++){
        int j=now;
        while(j<=n&&!a[j][i]) j++;
        if(j==n+1) continue;
        if(now!=j) swap(a[now],a[j]);
        for(int k=1;k<=n;k++) 
            if(k!=now&&a[k][i]) a[k]^=a[now];
        now++;
    }
}
int main(){
    freopen("in","r",stdin);
    int T=read();
    while(T--){
        t=read();n=t*t;
        ini();
        for(int i=1;i<=t;i++){
            scanf("%s",s+1);
            for(int j=1;j<=t;j++){
                int id=(i-1)*t+j;
                a[id][id]=1;
                if(i!=1) a[id][id-t]=1;
                if(i!=t) a[id][id+t]=1;
                if(j!=1) a[id][id-1]=1;
                if(j!=t) a[id][id+1]=1;
                a[id][n+1]=s[j]=='w';
            }
        }
        Gauss();
        int ans=0,flag=0;
        for(int i=1;i<=n;i++){
            if(a[i][n+1]){
                int f=0; 
                for(int j=1;j<=n;j++) if(a[i][j]==1) f=1;
                if(f==0) {flag=1;break;}
            }
            ans+=a[i][n+1];
        }
        if(flag) puts("inf");
        else printf("%d
",ans);
    }
}
原文地址:https://www.cnblogs.com/candy99/p/6410266.html