第三道高斯消元, 还是调试了好久, 有一些细节需要控制好, 不然虽然过了样例, 但还是错的, 特别在建立关系矩阵时不要弄错
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[250][250];
char str[20];
int gauss(int m)
{
int i, j, k;
int col = 1;
for(k=1; k<=m && col<=m; k++, col++)
{
if(!a[k][col])
{
for(i=k+1; i<=m; i++)
if(a[i][col])
break;
if(i <= m)
{
for(j=col; j<=m+1; j++)
swap(a[i][j], a[k][j]);
}
}
if(!a[k][col])
{
k--;
continue;
}
for(i=1; i<=m; i++)
if(i!=k && a[i][col])
for(j=col; j<=m+1; j++)
a[i][j] ^= a[k][j];
}
for(i=k; i<=m; i++)
if(a[i][m+1])
return -1;
k--;
for(i=k; i>=1; i--)
if(a[i][m+1] == 0)
k--;
return k;
}
int main()
{
int t, n, m;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
getchar();
m = n*n;
memset(a, 0, sizeof(a));
for(int i=1; i<=n; i++)
{
gets(str+1);
for(int j=1; j<=n; j++)
a[(i-1)*n+j][m+1] = str[j] == 'w' ? 1 : 0;
}
for(int i=1; i<=m; i++)
{
a[i][i] = 1;
if(i > n)
a[i][i-n] = 1;
if(i <= (n-1)*n)
a[i][i+n] = 1;
if(i%n != 1)
a[i][i-1] = 1;
if(i%n != 0)
a[i][i+1] = 1;
}
int ans = gauss(m);
if(ans == -1)
printf("inf\n");
else
printf("%d\n", ans);
}
return 0;
}