高斯消元
代码:
#include<iostream>
#include<fstream>
using namespace std;
int move[5][2]={0,1,0,-1,1,0,-1,0,0,0};
int n,m;
int a[300][300];
void solve(){
int i,j,k,s;
j=0;
for(i=0;i<n&&j<n;i++,j++)
{
for(k=i;k<n;k++)
if(a[k][j])
break;
if(k==n){
i--;
continue;
}
if(k!=i)
{
for(s=j;s<=n;s++)
swap(a[i][s],a[k][s]);
}
for(k=i+1;k<n;k++)
if(a[k][j])
for(s=j;s<=n;s++)
a[k][s]=a[k][s]^a[i][s];
}
k=i;
for(i=k;i<n;i++)
if(a[i][n])
{
cout<<"inf"<<endl;
return;
}
s=0;
for(i=k-1;i>=0;i--)
{
for(j=i+1;j<n;j++)
a[i][n]^=(a[i][j]&&a[j][n]);
if(a[i][n]) s++;
}
cout<<s<<endl;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t;
int cas;
cin>>cas;
char c;
while(cas--)
{
cin>>m;
n=m*m;
memset(a,0,sizeof(a));
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{
cin>>c;
if(c=='y')
a[i*m+j][n]=0;
else
a[i*m+j][n]=1;
}
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{
for(k=0;k<5;k++)
{
s=i+move[k][0];
t=j+move[k][1];
if(s>=0&&s<m&&t>=0&&t<m)
a[i*m+j][s*m+t]=1;
}
}
solve();
}
}
int main(){
read();
return 0;
}