#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
const int inf=0x3f3f3f3f;
template <typename T>
inline void _read(T& x){
char ch=getchar();bool sign=true;
while(!isdigit(ch)){if(ch=='-')sign=false;ch=getchar();}
for(x=0;isdigit(ch);ch=getchar())x=x*10+ch-'0';
if(!sign)x=-x;
}
int n,m;
int N;
int cnt=0;
int sum=0;
int minn;
int map[55][55];
int id[55][55];
int num[2005];
int ans[2005];
int dx[5]={0,1,0,-1,0};
int dy[5]={1,0,-1,0,0};
int a[2005][2005];
void dfs(int x,int var){
int i,j,k;
if(x==0&&var==0){
cnt=0;
for(i=1;i<=N;i++)cnt+=ans[i];
minn=min(minn,cnt);
return;
}
if(num[x]==var){
ans[var]=a[x][N+1];
for(i=var+1;i<=N;i++)ans[var]^=(a[x][i]&ans[i]);
dfs(x-1,var-1);
}
else{
ans[var]=1;dfs(x,var-1);
ans[var]=0;dfs(x,var-1);
}
}
void gauss(int equ,int var){
int i,j,k,h,maxn;
for(i=1,j=1;i<=equ&&j<=var;i++,j++){
maxn=i;
for(k=i+1;k<=equ;k++){
if(a[maxn][j]<a[k][j])maxn=k;
if(a[maxn][j]==1)break;
}
if(maxn!=i){
for(k=j;k<=var+1;k++)swap(a[i][k],a[maxn][k]);
}
num[i]=j;
if(a[i][j]==0){
i--;
continue;
}
for(k=i+1;k<=equ;k++){
if(a[k][j]!=0){
for(h=j;h<=var+1;h++){
a[k][h]^=a[i][h];
}
}
}
}
for(k=i;k<=equ;k++){
if(a[k][var+1]!=0){
puts("inf");
return;
}
}
if(i==var+1){
for(i=var;i;i--){
ans[i]=a[i][var+1];
for(j=i+1;j<=var;j++){
ans[i]^=(a[i][j]&ans[j]);
}
sum+=ans[i];
}
cout<<sum;
return;
}
minn=inf;
dfs(i-1,var);
cout<<minn;
return;
}
int main(){
int i,j,k;
cin>>n;
N=n*n;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
id[i][j]=++cnt;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
char ch=getchar();
while(!isalpha(ch))ch=getchar();
if(ch=='w'){
map[i][j]=1;
a[id[i][j]][N+1]=1;
}
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
for(k=0;k<5;k++){
int tx=i+dx[k];
int ty=j+dy[k];
if(tx<1||tx>n||ty<1||ty>n)continue;
a[id[i][j]][id[tx][ty]]=1;
}
}
}
gauss(N,N);
}
高斯消元(xor方程组)模板
最新推荐文章于 2024-02-20 01:09:51 发布