POJ_1753_Flip Game(二进制枚举)

来源:互联网 发布:c语言图形界面编程 编辑:程序博客网 时间:2024/06/12 01:17

题型:枚举


题意:

        4*4的棋盘上面放了16盏灯,有黑有亮。每次按一个灯,会改变本身及其上下左右四个灯的状态,即黑变白或白变黑,问最少需要按几次,可以将所有灯变为同一种状态,不能变则输出“Impossible”。


分析:

        如果按个多个灯,可以发现,这些操作的顺序是互不影响的。对于每个灯,按一次翻转,再按一次还原,所以可以发现,每个灯最多按一次足矣。

        采用二进制枚举,01串代表按下多少个灯及每个灯的位置,然后转换为操作后的状态并检查是否满足全部同一种状态。复杂度(2^16) * 16


代码:

#include<iostream>#include<cmath>#include<cstring>#include<cstdio>using namespace std;const int inf = 0x3f3f3f3f;char str[6][6];int lamp[6][6];int dir1[] = {0,0,1,-1};int dir2[] = {1,-1,0,0};void Copy() {    for(int i=0; i<4; i++) {        for(int j=0; j<4; j++) {            if(str[i][j] == 'b') {                lamp[i][j] = 0;            } else {                lamp[i][j] = 1;            }        }    }}bool check(int x,int y) {    if(x>=0&&x<4 && y>=0&&y<4) return true;    return false;}bool judge() {    int num0 = 0;    int num1 = 0;    for(int i=0; i<4; i++) {        for(int j=0; j<4; j++) {            if(lamp[i][j]) num1++;            else           num0++;        }    }    if(num0==16 || num1==16) return true;    return false;}int main() {    while(~scanf("%s",str[0])) {        scanf("%s",str[1]);        scanf("%s",str[2]);        scanf("%s",str[3]);        int ans = inf;        int step;        int all = (1<<16);        for(int i=0; i<all; i++) {            Copy();            step = 0;            for(int j=0; j<16; j++) {                if(i&(1<<j)) {                    step++;                    int x = j/4;                    int y = j%4;                    lamp[x][y] ^= 1;                    for(int k=0; k<4; k++) {                        int xx = x + dir1[k];                        int yy = y + dir2[k];                        if(check(xx,yy)) {                            lamp[xx][yy]^=1;                        }                    }                }            }            if(judge()) {                ans = min(ans,step);            }        }        if(ans == inf) {            puts("Impossible");        } else {            printf("%d\n",ans);        }    }    return 0;}

0 0
原创粉丝点击