#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 255;
const int inf = 0x3f3f3f3f;
const int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
int n;
int a[maxn][maxn];
int b[maxn];
int x[maxn];
bool can[maxn];
int ans;
int h[maxn];
bool yes(int x,int y)
{
if(x>=0 && x<n && y>=0 && y<n)
{
return true;
}
return false;
}
int get(int x,int y)
{
return x*n+y;
}
bool find(int line,int u)
{
for(int k=line;k<n*n;k++)
{
if(a[k][u]!=0)
{
for(int i=u;i<n*n;i++)
{
swap(a[k][i],a[line][i]);
}
swap(b[k],b[line]);
return true;
}
}
return false;
}
void dfs(int now)
{
if(now == n*n)
{
for(int u=n*n-1;u>=0;u--)
{
if(!can[u])
{
x[u]=b[h[u]];
for(int i=u+1;i<n*n;i++)
{
x[u]^=a[h[u]][i]*x[i];
}
}
}
int temp = 0;
for(int i=0;i<n*n;i++)
{
if(x[i])
{
temp++;
}
}
if(temp<ans)
{
ans = temp;
}
return ;
}
else
{
if(can[now])
{
x[now]=0;
dfs(now+1);
x[now]=1;
dfs(now+1);
}
else
{
dfs(now+1);
}
return ;
}
}
void start()
{
memset(can,false,sizeof(can));
memset(a,0,sizeof(a));
memset(x,0,sizeof(x));
int now,to;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
now = get(i,j);
a[now][now]=1;
for(int u=0;u<4;u++)
{
int tox = i + dir[u][0];
int toy = j + dir[u][1];
if(yes(tox,toy))
{
to = get(tox,toy);
a[now][to]=1;
}
}
}
}
int line=0;
for(int u=0;u<n*n;u++)
{
if(!find(line,u))
{
can[u]=true;
continue;
}
h[u]=line;
for(int k=line+1;k<n*n;k++)
{
if(a[k][u])
{
for(int i=u;i<n*n;i++)
{
a[k][i]^=a[line][i];
}
b[k]^=b[line];
}
}
line++;
}
ans=inf;
for(int i=line;i<n*n;i++)
{
if(b[i])
{
return ;
}
}
dfs(0);
return ;
}
int main()
{
int T;
cin>>T;
char c;
while(T--)
{
cin>>n;
for(int i=0;i<n*n;i++)
{
cin>>c;
if(c=='y')
{
b[i]=0;
}
else
{
b[i]=1;
}
}
start();
if(ans==inf)
{
cout<<"inf"<<endl;
}
else
{
cout<<ans<<endl;
}
}
return 0;
}
POJ 1681 Painter's Problem
最新推荐文章于 2022-02-25 19:38:17 发布