Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
高斯消元法~#include<iostream> #include<string.h> #define NUM 4*i+j #define INF 100000 using namespace std; char str[5][6]; int A[20][20]; int x[20]; int Y[20]; int Major[20]; int y; void init() { memset(A,0,sizeof(A)); for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { for(int k=0;k<=3;k++) { if(NUM+k*4<16)A[NUM+k*4][NUM]=1; if(NUM-k*4>=0)A[NUM-k*4][NUM]=1; if(NUM+k<=4*i+3)A[NUM+k][NUM]=1; if(NUM-k>=4*i)A[NUM-k][NUM]=1; } if(str[i][j]=='+')A[NUM][16]=1; } } } int dfs_fr(int row,int var) { if(row==-1||var==-1) { int sum=0; for(int i=0;i<16;i++) sum+=x[i]; if(sum<y) { for(int i=0;i<16;i++)Y[i]=x[i]; y=sum; } return y; } if(var==Major[row]) { int sum=A[row][16]; for(int j=var+1;j<16;j++) { if(A[row][j]==0)continue; sum^=x[j]; } x[var]=sum; dfs_fr(row-1,var-1); } else { for(int i=0;i<2;i++) { x[var]=i; dfs_fr(row,var-1); } } return y; } int Gauss() { int r,c; for(r=0,c=0;r<16&&c<16;r++,c++) { int max_r=r; for(int i=r+1;i<16&&!A[r][c];i++) { if(A[i][c]>A[r][c]){max_r=i;break;} } if(max_r!=r) { for(int j=0;j<=16;j++) swap(A[max_r][j],A[r][j]); } if(A[r][c]==0){r--;continue;} for(int i=r+1;i<16;i++) { if(A[i][c]==0)continue; for(int j=c;j<=16;j++) { A[i][j]^=A[r][j]; } } Major[r]=c; } y=INF; return dfs_fr(r-1,c-1); } int main() { while(cin>>str[0]) { for(int i=1;i<4;i++)cin>>str[i]; init(); int ans=Gauss(); cout<<ans<<endl; for(int i=0;i<16;i++) if(Y[i])cout<<i/4+1<<" "<<i%4+1<<endl; } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator