#include <cstdio> #include <cstring> #include <iostream> using namespace std; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int mp[16][16]; int x[16*16+2];// 用来存储解的情况 int a[16*16+2][16*16+2]; const int inf=90000009; void init() { memset(x,0,sizeof(x)); memset(a,0,sizeof(a)); } int check(int x,int y,int n) { if(x<=0 || x>=n+1 || y<=0 || y>=n+1) return -1; return 1; } void Debug(int n,int m) { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) cout<<a[i][j]<<‘ ‘; cout<<endl; } } int gauss(int n) { int max_r; int col,k; int i,j; int free_num=0; int freex[16+2]; for(int z=1;z<=n;z++) // 构造方程矩阵 { for(int zz=1;zz<=n;zz++) { i=(z-1)*n+zz;// row j=(z-1)*n+zz; a[i][n*n+1]=mp[z][zz]; a[i][j]=1; for(int low=0;low<4;low++) { int xx=z+dir[low][0]; int yy=zz+dir[low][1]; if(check(xx,yy,n)==1) //attention !! { j=(xx-1)*n+yy; // cout<<low<<‘ ‘<<xx<<‘ ‘<<yy<<endl; a[i][j]=1; } } } } //Debug(n*n,n*n+1); col=k=1; while( k<=n*n && col<=n*n) { max_r=k; for(int u=k;u<=n*n;u++) if(a[u][col]) { max_r=u; break; } if(a[max_r][col]!=0) { if(max_r!=k) { for(int u=0;u<=n*n+1;u++) swap(a[max_r][u],a[k][u]); } for(int u=k+1;u<=n*n;u++) // 转化为行阶梯 { if(a[u][col]) { for(int z=0;z<=n*n+1;z++) a[u][z]^=a[k][z]; } } k++; } else freex[free_num++]=col; // 当最大的也是0的时候,对应的col为自由元 col++; } // Debug(n*n,n*n+1); // 无解的时候 for(int u=k;u<=n*n;u++) { for(int uu=1;uu<=n*n+1;uu++) if(a[u][uu]) return -1; } // cout<<"123"<<endl; // cout<<k<<endl; if(k==n*n+1) // 有唯一解的时候 { // cout<<"1234"<<endl; int temp=0; int ret=0; for(int z=n*n; z>=1; z--) { x[z]=a[z][n*n+1]; for(int zz=z+1; zz<=n*n; zz++) if(a[z][zz]) { x[z]^=x[zz]; } if(x[z]==1) ret++; } return ret; } // 枚举自由变元 int ans=inf; for(int i=0;i<(1<<free_num);i++) // 二进制枚举 { int cnt=0; int temp=i; for(int j=0;j<free_num;j++) { if(temp & (1<<j)) { x[freex[j]]=1; cnt++; } } for(int z=n*n; z>=1; z--) { x[z]=a[z][n*n+1]; for(int zz=z+1; zz<=n*n; zz++) if(a[z][zz]) { x[z]^=x[zz]; } if(x[z]==1) cnt++; } ans=min(ans,cnt); } return ans; } int main() { int t; scanf("%d",&t); int Case=0; while(t--) { int n; init();//a x scanf("%d",&n); char temp[16][16]; for(int i=0;i<n;i++) { scanf("%s",temp[i]); } for(int i=0;i<n;i++) // 增广矩阵 { for(int j=0;j<n;j++) { if(temp[i][j]==‘y‘) mp[i+1][j+1]=0; else mp[i+1][j+1]=1; } } int flag=gauss(n); if(flag==-1) { cout<<"inf"<<endl; continue; } /* for(int i=1;i<=30;i++) { if(i%6!=0) printf("%d ",x[i]); else printf("%d\n",x[i]); } */ cout<<flag<<endl; } return 0; }
时间: 2024-10-03 23:17:46