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 |
Re:求高斯消元正解…………In Reply To:Re:求高斯消元正解………… Posted by:qiqijianglu at 2011-10-06 12:41:56 > 同求 发下我的代码吧,写的太二了…… //异或高斯消元最简单版本需要枚举自由变元确定最优解 //还没完成枚举自由变元的部分 #include<iostream> #include<cstring> #include<cstdio> #include<vector> using namespace std; #define maxn 20 int a[maxn][maxn]; int b[maxn][maxn]; int n; int pre[maxn]; int post[maxn]; int x[maxn]; char map[maxn][maxn]; bool x_free[maxn]; void Debug() { for(int i=0;i<n;i++) { for(int j=0;j<n+1;j++) { printf("%d ",a[i][j]); } printf("\n"); } } int Gauss(int a[maxn][maxn]) { int max_r,i,col; int free_index,free_x_num; vector<int> v; for(i=0,col=0;i<n&&col<n;i++,col++) { max_r=i; for(int j=i+1;j<n;j++) { if(a[j][col]>a[max_r][col]) { max_r=j; } } if(max_r!=i) { for(int j=0;j<=n;j++) { swap(a[i][j],a[max_r][j]); } } if(a[i][col]==0) { v.push_back(col); i--;continue; } for(int j=i+1;j<n;j++) { if(a[j][col]!=0) { for(int k=col;k<n+1;k++) { a[j][k]=a[j][k]^a[i][k]; } } } } for(int k=i;k<n;k++) { if(a[k][n]) return 17; } int ans=n*n; for(int xx=0;xx<(1<<v.size());xx++) { int t=xx; memset(x_free,0,sizeof(x_free)); for(int j=0;j<v.size();j++) { x_free[v[j]]=1; } for(int k=0;k<v.size();k++) { x[v[k]]=t%2; t/=2; } for(int j=i-1;j>=0;j--) { free_x_num=0; for(int k=0;k<n;k++) { if(a[j][k]!=0&&!x_free[k]) free_x_num++,free_index=k; } if(free_x_num>1||free_x_num==0) {printf("fuck\n");continue;} int temp=a[j][n]; for(int k=0;k<n;k++) { if(a[j][k]!=0&&k!=free_index) temp^=x[k]; } x[free_index]=temp; x_free[free_index]=true; } int s=0; for(int j=0;j<n;j++) { s+=x[j]; //printf("%d ",x[j]); } //printf("\n"); ans=min(s,ans); } return ans; } int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; int main(void) { n=4*4; for(int i=0;i<4;i++) { scanf("%s",map[i]); } for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { a[i*4+j][n]=map[i][j]=='b'?0:1; } } for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { a[i*4+j][i*4+j]=1; for(int k=0;k<4;k++) { int x=i+dx[k]; int y=j+dy[k]; if(x>=0&&x<4&&y>=0&&y<4) { a[x*4+y][i*4+j]=1; } } } } //Debug(); memset(x_free,0,sizeof(x_free)); memset(x,-1,sizeof(x)); for(int i=0;i<16;i++) { for(int j=0;j<=16;j++) { b[i][j]=a[i][j]; } } int ans=Gauss(a); for(int i=0;i<16;i++) { b[i][n]=b[i][n]^1; } memset(x_free,0,sizeof(x_free)); memset(x,-1,sizeof(x)); int tmp=Gauss(b); ans=min(ans,tmp); if(ans==17)printf("Impossible\n"); else printf("%d\n",ans); //Debug(); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator