POJ 3279

来源:互联网 发布:淘宝客服部门奖罚制度 编辑:程序博客网 时间:2024/06/07 04:01
#include<cstdio>#include<string.h>using namespace std;const int maxn=30;int a[maxn][maxn],b[maxn][maxn],ans[maxn][maxn];int m,n,f;int check(int k){    for(int i=0;i<n;i++)    {        if(k&(1<<i))        {            ans[0][i]=1;            b[0][i]^=1;            if(1<m)b[1][i]^=1;            if(i-1>=0)b[0][i-1]^=1;            if(i+1<n)b[0][i+1]^=1;        }    }    for(int i=1;i<m;i++)    {        for(int j=0;j<n;j++)        {            if(b[i-1][j]==1)            {                ans[i][j]=1;                b[i][j]^=1;                b[i-1][j]^=1;                if(i+1<m)                    b[i+1][j]^=1;                if(j+1<n)                    b[i][j+1]^=1;                if(j-1>=0)                    b[i][j-1]^=1;            }        }    }    for(int j=0;j<n;j++)    {        if(b[m-1][j]==1)            return 0;    }    return 1;}int main(){    int i,j;    while(scanf("%d%d",&m,&n)==2)    {        for(int i=0;i<m;i++)        {            for(int j=0;j<n;j++)            {                scanf("%d",&a[i][j]);            }        }        f=0;        for(i=0;i<(1<<n);i++)        {            memcpy(b,a,sizeof(a));            memset(ans,0,sizeof(ans));            if(check(i))            {                f=1;                for(int i=0;i<m;i++)                {                    for(int j=0;j<n;j++)                    {                        if(j==n-1)                            printf("%d\n",ans[i][j]);                         else                            printf("%d ",ans[i][j]);                    }                }                break;            }        }     if(!f)    printf("IMPOSSIBLE\n");  }    return 0;}

改题的想法不错,先考虑第一行的解决方案的种类,对于题目的例子则可以有16中方案  如0 0 0 0\0 0 0 1\0 0 1 0.....等等对于每一种方案,再进行之下的几行的做法.对于题目中说的考虑什么字典序,感觉是个小坑,没有什么考虑也是可以AC的.

然后这个题目很大得学习到了ACM里的位运算和二进制的运算方法和许多的小技巧.

0 0
原创粉丝点击