D - Fliptile

思路:确定第一行,其他的也就逐步确定了。
#include<cstdio>  
#include<cstring>  
#include<iostream>  
#include<algorithm>  
using namespace std;  
int n,m;
int minn=1000000009; 
int f[1001][1001],ans[1001][1001],cz[1001][1001],a[1001][1001];

void dfs(int lie){  
    if(lie>m){
        for(int i=1;i<=n;i++)  
            for(int j=1;j<=m;j++)  cz[i][j]=a[i][j];
        for(int i=1;i<=m;i++)  
            if(f[1][i]){  
                cz[1][i]^=1;cz[2][i]^=1;  
                cz[1][i+1]^=1;cz[1][i-1]^=1;  
            }  
        for(int i=2;i<=n;i++)  
            for(int j=1;j<=m;j++){  
                if(cz[i-1][j]==1){  
                    f[i][j]=1;cz[i][j]^=1;  
                       cz[i][j+1]^=1;cz[i][j-1]^=1;  
                    cz[i+1][j]^=1;cz[i-1][j]^=1;
                }  
                else f[i][j]=0;
            }  
        bool pd=false;
        for(int i=1;i<=n;i++)  
            for(int j=1;j<=m;j++)  
                if(cz[i][j]){
                    pd=true;  
                    break;  
                }
        if(!pd){
            int sum=0;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++)
                    if(f[i][j])    sum++;
            if(sum>=minn) return;
            minn=sum;
            for(int i=1;i<=n;i++)
                for(int j=1;j<=m;j++) 
                    ans[i][j]=f[i][j];
        }
        return;
    }
    for(int i=0;i<=1;i++){  
        f[1][lie]=i;
        dfs(lie+1);
    }  
}
int main(){  
    scanf("%d%d",&n,&m);  
    for(int i=1;i<=n;i++)  
        for(int j=1;j<=m;j++)  
            cin>>a[i][j];
    dfs(1);
    if(minn==1000000009){
        cout<<"IMPOSSIBLE";
        return 0;
    }
    for(int i=1;i<=n;i++){  
        for(int j=1;j<=m;j++)  
            cout<<ans[i][j]<<" ";  
        cout<<endl;
    }    
}
/*
4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1
*/

 

posted @ 2018-02-22 17:39  一蓑烟雨任生平  阅读(171)  评论(0编辑  收藏  举报