第一次学怎么用高斯消元法解抑或方程组,思想其实很简单,方法可以看下面的链接:http://blog.csdn.net/zhuichao001/article/details/5440843
有了这种思想之后,一些简单的翻牌问题也算是有了头绪,还记得之前做一到翻一次牌影响曼哈顿距离为k的点的题,现在看来是有思路,但那个貌似是900个点,不好搞呀,自己回头再想想吧。。先贴一记水题的代码
#include<iostream> #include<cstring> #include<cstdio> #include<string> #include<algorithm> using namespace std; int m[10][10]; int ans[10][10]; int eq[40][40]; void gauss(int a[40][40]) { for(int i=0;i<30;++i){ int k=i; for(;k<30;++k){ if(a[k][i]!=0){ break; } } for(int j=0;j<=30;++j){ swap(a[i][j],a[k][j]); } for(int j=0;j<30;++j){ if(i!=j&&a[j][i]){ for(int k=0;k<=30;++k){ a[j][k]=a[i][k]^a[j][k]; } } } } for(int i=0;i<30;++i){ ans[i/6][i%6]=eq[i][30]; } } int main() { int T;cin>>T;int ca=0; while(T--) { memset(eq,0,sizeof(eq)); for(int i=0;i<5;++i){ for(int j=0;j<6;++j){ scanf("%d",&m[i][j]); eq[i*6+j][30]=m[i][j]; eq[i*6+j][i*6+j]=1; if(j-1>=0) eq[i*6+j][i*6+j-1]=1; if(j+1<6) eq[i*6+j][i*6+j+1]=1; if(i*6+j-6>=0) eq[i*6+j][i*6+j-6]=1; if(i*6+j+6<=29) eq[i*6+j][i*6+j+6]=1; } } gauss(eq); printf("PUZZLE #%d\n",++ca); for(int i=0;i<5;++i){ printf("%d",ans[i][0]); for(int j=1;j<6;++j){ printf(" %d",ans[i][j]); } puts(""); } } return 0; }