poj 1681
依旧是开关问题,多了一个无解的判断。
ac代码:
#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]; 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; 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++; } 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; } 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 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; }