跟1222 差不多,练习练习
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
#define MAXA 25005
#define MAXN 50005
#define LL long long
#define MOD 10000000000
int a[300][300];
int b[300][300];
int ans[300];
int mp[300][300];
char ch[300];
int dx[]={0,-1,0,1,0};
int dy[]={1,0,-1,0,0};
void init(int n)
{
int tmp=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
mp[i][j]=tmp++;
}
}
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<5;k++)
{
if(i+dx[k]<0||i+dx[k]>=n||j+dy[k]<0||j+dy[k]>=n)continue;
int nto=mp[i][j];
int to=mp[i+dx[k]][j+dy[k]];
a[nto][to]=1;
a[to][nto]=1;
}
}
}
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
init(n);
//memset(b,0,sizeof(b));
for(int i=0;i<n*n;i++)
{
for(int j=0;j<n*n;j++)
{
b[i][j]=a[i][j];
}
}
int tmp=0;
for(int i=0;i<n;i++)
{
scanf("%s",ch);
for(int j=0;j<n;j++)
{
if(ch[j]=='y')
b[tmp++][n*n]=0;
else
b[tmp++][n*n]=1;
}
}
for(int i=0;i<n*n;i++)
{
for(int j=i;j<n*n;j++)
{
if(b[j][i]!=0)
{
swap(b[j],b[i]);
break;
}
}
if(b[i][i]==0)continue;
for(int j=i+1;j<n*n;j++)
{
if(b[j][i]==0)continue;
for(int k=i;k<=n*n;k++)
{
b[j][k]=((b[j][k]-b[i][k])%2+2)%2;
}
}
}
int tot=0;
bool flag=true;
for(int i=n*n-1;i>=0;i--)
{
int sum=0;
for(int j=i+1;j<n*n;j++)
{
sum=sum+ans[j]*b[i][j];
}
ans[i]=((b[i][n*n]-sum)%2+2)%2;
tot+=ans[i];
if(ans[i]==1&&b[i][i]==0)
flag=false;
}
if(flag)
printf("%d\n",tot);
else
puts("inf");
}
return 0;
}