FLIPTILE POJ NO.3279

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int maxn = 16;
int g[maxn][maxn];
int flip[maxn][maxn];
int ans[maxn][maxn];
int m,n,res = -1;
int dx[]={-1,1,0,0,0};
int dy[]={0,0,0,1,-1};
void print(int mx[16][16])
{
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%d%c",mx[i][j],j+1==n?'\n':' ');
        }
    }
    cout << endl;
} 
int get(int x,int y)
{
    int sum = g[x][y];
    for(int i=0;i<5;i++)
    {
        int newx = x+dx[i];
        int newy = y+dy[i];
        if(newx>=0 && newx<m && newy>=0 && newy<n)
        {
            sum+=flip[newx][newy];
        }
    }
    return sum%2;
}
int calc()
{
    int number = 0;
    for(int i=0;i<n;i++)
        if(flip[0][i]==1) number++; 
    for(int i=1;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(get(i-1,j))
            {
                number++;
                flip[i][j]=1;
            }
        }
    }
    for(int i=0;i<n;i++)
        if(get(m-1,i)) return -1;
    return number;     
}
void solve()
{
    for(int i=0;i < 1<<n;i++)
    {
        memset(flip,0,sizeof(flip));
        for(int j=0;j<n;j++)
        {
            flip[0][n-1-j]=i>>j&1;
            int ret = calc();
            //if(ret<res || res == -1)
            //if((res!=-1 && ret<res) || res == -1)
            //if(ret>=0) print(flip);
            if(ret>=0 && (ret<res || res == -1))
            {
                res = ret;
                memcpy(ans,flip,sizeof(flip));
            }
        }
    }
    if(res == -1)
    {
        cout<<"IMPOSSIBLE\n";
    }
    else 
    {
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                printf("%d%c",ans[i][j],j+1==n?'\n':' ');
            }
        }
    }
}

int main(void)
{
    cin >> m >> n;
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        cin >> g[i][j]; 
    }
    solve();
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/zuimeiyujianni/p/10017060.html