poj1222

    科技2022-07-20  111


    poj1222


    当模板用

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; int dx[]={0,0,0,-1,1}; int dy[]={0,1,-1,0,0}; int f[10][10]; int flip[10][10]; int otp[10][10]; int get(int x,int y) { int c=f[x][y]; for(int i=0;i<5;i++){ int x2=x+dx[i],y2=y+dy[i]; if(x2>=0&&x2<5&&y2>=0&&y2<6) c+=flip[x2][y2]; } return c%2; } int calc() { for(int i=1;i<5;i++){ for(int j=0;j<6;j++){ if(get(i-1,j)!=0){ flip[i][j]=1; } } } for(int i=0;i<6;i++){ if(get(4,i)!=0){ return -1; } } int ans=0; for(int i=0;i<5;i++){ for(int j=0;j<6;j++){ ans+=flip[i][j]; } } return ans; } int main() { int num; cin>>num; int cnt=1; while(num--){ int res=-1; for(int i=0;i<5;i++){ for(int j=0;j<6;j++){ cin>>f[i][j]; } } for(int i=0;i<1<<6;i++){ //按照字典序尝试第一行的所有可能性 memset(flip,0,sizeof(flip)); for(int j=0;j<6;j++){ flip[0][6-j-1]=(i>>j)&1; //是利用01字符串初始化而已,用时候还是01数组 } //注意是倒着来的 int ans=calc(); if(ans>=0&&(ans<=res||res==-1)){ res=ans; memcpy(otp,flip,sizeof(flip)); } } printf("PUZZLE #%d\n",cnt++); for(int i=0;i<5;i++){ for(int j=0;j<6;j++){ cout<<otp[i][j]; if(j!=5)cout<<" "; else cout<<endl; } } } return 0; }
    这是二维下的翻转问题,可以用bfs,也可以用这种翻转基本法,高斯消元还没学,不晓得怎么搞
    Processed: 0.010, SQL: 8