zoukankan      html  css  js  c++  java
  • POJ-1753 Flip Game---二进制枚举子集

    题目链接:

    https://vjudge.net/problem/POJ-1753

    题目大意:

    有4*4的正方形,每个格子要么是黑色,要么是白色,当把一个格子的颜色改变(黑->白或者白->黑)时,其周围上下左右(如果存在的话)的格子的颜色也被反转,问至少反转几个格子可以使4*4的正方形变为纯白或者纯黑?

    思路:

    直接二进制枚举16个元素的子集,判断哪些点需要进行翻转操作

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #include<stack>
     8 #include<map>
     9 using namespace std;
    10 typedef long long ll;
    11 const int maxn = 1e6 + 10;
    12 const int INF = 1 << 30;
    13 int T, n, m;
    14 bool a[6][6], b[6][6], v[6][6];
    15 int dir[4][2] = {1,0,0,1,-1,0,0,-1};
    16 int f(int x)
    17 {
    18     int tot = 0;
    19     for(int i = 0; i < 16; i++)
    20         if(x & (1 << i))tot++;
    21     return tot;
    22 }
    23 bool judge(int x)
    24 {
    25     memcpy(b, a, sizeof(a));
    26     for(int i = 0; i < 16; i++)
    27     {
    28         if(x & (1 << i))
    29         {
    30             int cx = i / 4;
    31             int cy = i % 4;
    32             b[cx][cy] = !b[cx][cy];
    33             for(int j = 0; j < 4; j++)
    34             {
    35                 int xx = cx + dir[j][0];
    36                 int yy = cy + dir[j][1];
    37                 if(xx < 0 || xx >= 4 || yy < 0 || yy >= 4)continue;
    38                 b[xx][yy] = !b[xx][yy];
    39             }
    40         }
    41     }
    42     int num = 0;
    43     for(int i = 0; i < 4; i++)
    44     {
    45         for(int j = 0; j < 4; j++)
    46             if(b[i][j])num = num * 2;
    47             else num = num * 2 + 1;
    48     }
    49     if(num == 0 || num == ((1<<16) - 1))return true;
    50     return false;
    51 }
    52 int main()
    53 {
    54     int ans = 10000;
    55     for(int i = 0; i < 4; i++)
    56     {
    57         for(int j = 0; j < 4; j++)
    58         {
    59             char c = getchar();
    60             if(c == 'b')a[i][j] = 1;
    61         }
    62         getchar();
    63     }
    64     for(int i = 0; i < (1<<16); i++)
    65     {
    66         if(judge(i))
    67         {
    68             ans = min(ans, f(i));
    69         }
    70     }
    71     if(ans == 10000)printf("Impossible
    ");
    72     else cout<<ans<<endl;
    73     return 0;
    74 }

  • 相关阅读:
    oracle 聚合函数 LISTAGG ,将多行结果合并成一行
    oracle 数据库对于多列求最大值
    Java 简单的rpc 一
    centos7 安装php7
    win10下VM 中centos 安装共享文件
    CentOS7 cannot find a valid baseurl for repo base
    分布式事务
    利用虚拟映射文件加密大文件
    动态代理
    c++ 11 lambda表达式
  • 原文地址:https://www.cnblogs.com/fzl194/p/8710920.html
Copyright © 2011-2022 走看看