| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 31227 | Accepted: 13583 |
Description
Consider the following position as an example:Input
Output
Sample Input
bwwb bbwb bwwb bwww
Sample Output
4
Source
#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=100;
const int maxm=100;
const int inf=0xfffffff;
int a[maxn][maxm],x[maxm];
int gauss(int n)
{
int row,line,i,j,m,free[maxm],cnt=0,t,mn,sum,k;
for(row=line=0;line<n;row++,line++)
{
i=row;
for(j=row+1;j<n;j++)
if(a[j][line]>a[i][line])
i=j;
if(i!=row)
for(j=row;j<=n;j++)
swap(a[i][j],a[row][j]);
if(a[row][line]==0)
{
free[cnt++]=line;
row--;
continue;
}
for(i=row+1;i<n;i++)
if(a[i][line]==1)
for(j=line;j<=n;j++)
a[i][j]^=a[row][j];
}
for(i=row;i<n;i++)
if(a[i][n]==1)
return -1;
mn=inf;
m=1<<cnt;
memset(x,0,sizeof(x));
for(i=0;i<m;i++)
{
t=i;
sum=0;
for(j=0;j<cnt;j++)
{
x[free[j]]=t&1;
if(x[free[j]]==1)
sum++;
t>>=1;
}
for(j=row-1;j>-1;j--)
{
x[j]=a[j][n];
for(k=j+1;k<n;k++)
x[j]^=a[j][k]&x[k];
if(x[j]==1)
sum++;
}
mn=min(sum,mn);
}
return mn;
}
void init(int n)
{
int i,j,t;
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
t=i*n+j;
a[t][t]=1;
if(i!=0)
a[(i-1)*n+j][t]=1;
if(i!=n-1)
a[(i+1)*n+j][t]=1;
if(j!=0)
a[t-1][t]=1;
if(j!=n-1)
a[t+1][t]=1;
}
}
int main()
{
int i,j,n=4,ans,m=16,t;
char s[maxn][maxm];
while(scanf("%s",s[0])!=EOF)
{
for(i=1;i<n;i++)
scanf("%s",s[i]);
init(n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(s[i][j]=='b')
a[i*n+j][m]=1;
t=gauss(m);
t=t==-1?inf:t;
init(n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(s[i][j]=='w')
a[i*n+j][m]=1;
ans=gauss(m);
ans=ans==-1?inf:ans;
ans=min(ans,t);
if(ans==inf)
printf("Impossible\n");
else
cout<<ans<<endl;
}
}poj1753-Flip Game(高斯消元枚举xor线性方程自由变元的值,找为1解的最少数量)
原文:http://blog.csdn.net/stl112514/article/details/39803963