開關燈類問題 (高斯消元)
阿新 • • 發佈:2018-12-26
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[35][35]; int x[35]; int free_x[35]; int guass(int equ,int var) { int free_num=0; int r=0,c=0; while(r<equ&&c<var) { int t=r; for(int i=r+1;i<equ;i++) { if(abs(a[i][c])>abs(a[t][c])) t=i; } if(t!=r) { for(int i=c;i<=var;i++) swap(a[t][i],a[r][i]); } if(a[r][c]) { for(int i=r+1;i<equ;i++) { if(a[i][c]) { for(int j=c;j<=var;j++) a[i][j]^=a[r][j]; } } r++; } else free_x[free_num++]=c; c++; } for(int i=r;i<equ;i++) if(a[i][var]) return -1; if(r<var) return var-r; for(int i=var-1;i>=0;i--) { x[i]=a[i][var]; for(int j=i+1;j<var;j++) { x[i]^=(a[i][j]&&x[j]); } } return 0; } int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); memset(a,0,sizeof(a)); memset(free_x,0,sizeof(free_x)); memset(x,0,sizeof(x)); for(int i=0;i<n;i++) { scanf("%d",&a[i][n]); } for(int i=0;i<n;i++) { int b; scanf("%d",&b); a[i][n]^=b; a[i][i]=1; } int u,v; while(scanf("%d%d",&u,&v)==2,u+v) { a[v-1][u-1]=1; } int k=guass(n,n); if(k==-1) printf("Oh,it's impossible~!!\n"); else printf("%d\n",1<<k); } }
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[300][300]; int free_x[300]; int x[300]; char q[30]; void init() { memset(a,0,sizeof(a)); memset(x,0,sizeof(x)); } int gauss(int equ,int var) { int free_num=0,r=0,c=0; while(r<equ&&c<var) { int t=r; for(int i=r+1;i<equ;i++) { if(abs(a[t][c])<abs(a[i][c])) t=i; } if(t!=r) { for(int i=c;i<=var;i++) { swap(a[t][i],a[r][i]); } } if(a[r][c]) { for(int i=r+1;i<equ;i++) { if(a[i][c]) for(int j=c;j<=var;j++) { a[i][j]^=a[r][j]; } } r++; } else { free_x[free_num++]=c; } c++; } for(int i=r;i<equ;i++) { if(a[i][var]) return -1; } for(int i=var-1;i>=0;i--) { x[i]=a[i][var]; for(int j=i+1;j<var;j++) x[i]^=(x[j]&&a[i][j]); } return 0; } int main() { int T; scanf("%d",&T); while(T--) { int n,cnt=0; scanf("%d",&n); init(); for(int i=0;i<n;i++) { scanf("%s",q); for(int j=0;q[j];j++) { a[cnt][cnt]=1; if(i>0) a[cnt-n][cnt]=1; if(i<n-1) a[cnt+n][cnt]=1; if(j>0) a[cnt-1][cnt]=1; if(j<n-1) a[cnt+1][cnt]=1; if(q[j]=='w') a[cnt++][n*n]=1; else cnt++; } } int k=gauss(n*n,n*n); if(!k) { int ans=0; for(int i=0;i<n*n;i++) ans+=x[i]; printf("%d\n",ans); } else printf("inf\n"); } }