poj3279 // 搜索

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;


int n,m,map[21][21],fi[21][21],oi[21][21],d[5][2] = {{1,0},{-1,0},{0,0},{0,-1},{0,1}};


int panduan(int x,int y)//查询(x,y)的颜色   
{  
    int i,c=map[x][y];  
    for(i=0;i<5;++i)  
    {  
        int x2=x+d[i][0],y2=y+d[i][1];  
        if(0<=x2&&x2<n&&0<=y2&&y2<m)  
            c+=fi[x2][y2];  
    }  
    return c%2;  
}  


int solve()  
{  
    int i,j,res;  
    for(i=1;i<n;++i)  
    {  
        for(j=0;j<m;++j)  
        {  
            if(panduan(i-1,j)!=0)//上方格子是黑色,必须必须反转(i,j)号格子   
                fi[i][j]=1;   
        }  
    }  
    for(i=0;i<m;++i)//判断最后一行是否全白   
    {  
        if(panduan(n-1,i)!=0)//当前方案不行   
            return -1;  
    }  
    res=0;  
    for(i=0;i<n;++i)  
    {  
        for(j=0;j<m;++j)  
        {  
            res+=fi[i][j];//统计当前方案的反转次数   
        }  
    }  
    return res;  
}  


int main()  
{  
    int i,j,ans,num;  
    while(scanf("%d%d",&n,&m)!=EOF)  
    {  
        for(i=0;i<n;++i)  
        {  
            for(j=0;j<m;++j)  
                scanf("%d",&map[i][j]);  
        }  
        ans=-1;  
        //按照字典序尝试第一行所有的可能性,方案为2^m种   
        for(i=0;i< 1<<m;++i)  
        {  
            memset(fi,0,sizeof(fi));  
            for(j=0;j<m;++j)  
                fi[0][m-j-1]=i>>j&1;  
            num=solve();  
            if(num>=0&&(ans<0||ans>num))  
            {  
                ans=num;  
                memcpy(oi,fi,sizeof(fi));//把flip数组复制给opt数组   
            }  
        }  
        if(ans==-1)  
            printf("IMPOSSIBLE\n");  
        else  
        {  
            for(i=0;i<n;++i)  
            {  
                for(j=0;j<m;++j)  
                {  
                    if(j==m-1)  
                        printf("%d\n",oi[i][j]);  
                    else  
                        printf("%d ",oi[i][j]);  
                }  
            }  
        }  
    }  
    return 0;  
}  

猜你喜欢

转载自blog.csdn.net/dukig/article/details/80141813
今日推荐