POJ 3279 (枚举+二进制)

来源:互联网 发布:淘宝上买卫生巾靠谱吗 编辑:程序博客网 时间:2024/05/21 21:49

还是不是很懂呀!


#include<cstdio>#include<cstring>#define maxn 30int gragh[maxn][maxn];int ans[maxn][maxn];int temp[maxn][maxn];int dir[5][2] = {{1,0},{-1,0},{0,0},{0,1},{0,-1}};int step;int n,m;int press(int x,int y){    int c = gragh[x][y];    for(int i = 0;i < 5; i++){        int dx = dir[i][0] + x;        int dy = dir[i][1] + y;        if(dx >= 0 && dx < n && dy >= 0 && dy < m){            c += temp[dx][dy];        }    }    return c%2;}int judge(){    int pos = 0;    for(int i = 1;i < n; i++){        for(int j = 0;j < m; j++){            if(press(i-1,j))                temp[i][j] = 1;        }    }    for(int i = 0;i < m; i++)        if(press(n-1,i))            return -1;    for(int i = 0;i < n; i++){        for(int j = 0;j < m; j++)            pos += temp[i][j];    }    return pos;}int main(){    //freopen("in.txt","r",stdin);    while(scanf("%d%d",&n,&m) != EOF){        for(int i = 0;i < n; i++){            for(int j = 0;j < m; j++){                scanf("%d",&gragh[i][j]);            }        }        step = 99999999;        memset(temp,0,sizeof(temp));        memset(ans,0,sizeof(ans));        for(int i = 0;i < (1<<m);i++){            memset(temp,0,sizeof(temp));            for(int j=0;j<m;j++)                temp[0][m-j-1] = i>>j&1;            int t = judge();            if(t < step && t != -1){                step = t;                memcpy(ans,temp,sizeof(temp));            }        }        if(step == 99999999){            printf("IMPOSSIBLE\n");        }        else{            for(int i = 0;i < n; i++){                for(int j = 0;j < m; j++){                    if(j == m-1)                        printf("%d\n",ans[i][j]);                    else                        printf("%d ",ans[i][j]);                }            }        }    }    return 0;}


0 0