题目链接:http://poj.org/problem?id=1753

题意:

    给你一个4*4的棋盘,上面有两种颜色的棋子(一种黑色,一种白色),你一次可以选择一个棋子翻转它(黑色变成白色,同理反之),选择的这枚棋子的上下左右都会被翻动(前提是上下左右都可以被翻动)。问最少可以翻动多少颗棋子,让整个棋盘变成全部黑色或者全部白色。

题解:

   4*4一共就16个格子,每个格子都可以是翻或者不翻,那么就是216翻法。

   所以就可以用状态压缩的方法来解决。

   比如说47。 47的二进制是00101111,我们就可以认为(从右往左)第1,2,3,4,6位是我们选择要翻转的棋子,而为0的位是我们不翻的。这样只要把1~16与4*4的坐标做一个映射就可以知道我们要翻那一个棋子了。把全部棋子翻完之后判断一下是不是全部是一种颜色,是就更新ans。

————————————————————

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <sstream>
#include <algorithm>
using namespace std;
#define pb push_back
#define mp make_pair
#define ms(a, b) memset((a), (b), sizeof(a))
//#define LOCAL
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int maxn = +;
const int mod = 1e9+;
char input[][];
bool color[][];//0为白,1为黑
void reset()//重新初始化color表
{
for(int i=;i<;i++)
for(int j=;j<;j++)
if(input[i][j] == 'b') color[i][j] = ;
else color[i][j] = ;
}
int cnt(int b)//计算b的二进制中右多少个1。
{
int num = ;
while(b>){
num++;
b&=(b-);
}
return num;
}
void clean(int j)//翻转棋子
{
int x, y;
if(j<&&j>=) x=, y=j;
else if(j<&&j>=) x=, y = j-;
else if(j<&&j>=) x=, y = j-;
else x = , y = j-;
// printf("%d %d %d\n", j, x, y);
color[x][y] = !color[x][y];
if(x->=) color[x-][y] = !color[x-][y];//上
if(x+<) color[x+][y] = !color[x+][y];//下
if(y->=) color[x][y-] = !color[x][y-];//左
if(y+<) color[x][y+] = !color[x][y+];//右
}
int judge()
{
bool flag1=;//全0;
bool flag2=;//全1; //判断是不是为全0
for(int i=;i<;i++){
for(int j=;j<;j++){
if(color[i][j]==) {flag1=;break;}//如果出现了1就break
}
}
if(flag1==) return ;//如果是就直接返回1,即表为全0 //同理判断是不是为全1
for(int i=;i<;i++){
for(int j=;j<;j++){
if(color[i][j] == ) {flag2 = ;break;}
}
}
if(flag2==) return ;
return ;//既不是全0,又不是全1,就返回0.
}
int main() {
#ifdef LOCAL
freopen("input.txt" , "r", stdin);
#endif // LOCAL
for(int i=;i<;i++)
scanf("%s", input[i]);
int ans = inf;
// for(int i=0;i<16;i++)
// clean(i);
for(int i=;i<(<<);i++){
reset();
int take = cnt(i);
for(int j = ;j<;j++){
if(i&(<<j)){
clean(j);
}
}
if(judge()){
ans = min(ans, take);
}
}
reset();//最后判断初始的时候是否已经是全0或者全1
if(judge()) ans = ;
if(ans !=inf)
printf("%d\n", ans);
else
printf("Impossible\n");
return ;
}

POJ 1753 Flip Game (状压+暴力)的更多相关文章

  1. POJ 1753 Flip Game 状态压缩,暴力 难度:1

    Flip Game Time Limit: 1000MS  Memory Limit: 65536K  Total Submissions: 4863  Accepted: 1983 Descript ...

  2. 枚举 POJ 1753 Flip Game

    题目地址:http://poj.org/problem?id=1753 /* 这题几乎和POJ 2965一样,DFS函数都不用修改 只要修改一下change规则... 注意:是否初始已经ok了要先判断 ...

  3. POJ 1324 Holedox Moving (状压BFS)

    POJ 1324 Holedox Moving (状压BFS) Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 18091 Acc ...

  4. POJ 1753 Flip Game(高斯消元+状压枚举)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 45691   Accepted: 19590 Descr ...

  5. POJ 3279 - Fliptile - [状压+暴力枚举]

    题目链接:http://poj.org/problem?id=3279 Sample Input 4 4 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 Sample Output 0 ...

  6. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  7. POJ 3254 Corn Fields (状压dp)

    题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...

  8. POJ 3254 - Corn Fields - [状压DP水题]

    题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...

  9. HDU 5765 Bonds 巧妙状压暴力

    题意:给一个20个点无向连通图,求每条边被多少个极小割集包括 分析:极小割集是边的集合,很显然可以知道,极小割集恰好吧原图分成两部分(这个如果不明白可以用反证法) 然后就是奉上官方题解:http:// ...

  10. [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp

    题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...

随机推荐

  1. 应用安全-Web安全-注入篇

    asp站点 ()and = 和 and =)服务器类型判断(ACCESS MSSQL) http://URL.asp?id=24 and (select count(*) from sysobject ...

  2. StringBuffer 和Stringbuilder源码分析

    首先看一下他们的继承关系   这个两个对象都继承了AbstractStringBuilder抽象类.   1.他们的实现方式都一样的,唯一区别的StringBuffer在多线程的时候是保证了数据安全, ...

  3. 21次C++作业

    //第一题目 class A //A为基类 {public: void f1( ); int i; protected: void f2(); int j; private: int k; }; /* ...

  4. AI会议网站

    <麻省理工科技评论>新兴科技峰会EmTech China : http://www.emtechchina.cn/ IT大咖说 各种科技前沿会议发布站 : http://www.itdks ...

  5. SpringBoot使用webservice

    Pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spr ...

  6. Mybatis-学习笔记(2)Mybatis配置文件

      3>typeAliases:类型别名.2种指定方式. 1>给某个类起个别名 <typeAliases> <typeAlias type="com.lfy.b ...

  7. [SP3267]DQUERY - D query

    题目传送门 维护一个区间内不同数的个数,最直观的想法是直接排序后用树状数组维护即可.但是我们发现n只有3e4,于是我们想到了可以拿一个$O(n\sqrt{n})$的莫队维护.关于莫队算法如果有不知道的 ...

  8. Elasticsearch7.X 入门学习第一课笔记----基本概念

    原文:Elasticsearch7.X 入门学习第一课笔记----基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...

  9. fanc委托在项目中使用

    一,上代码 using System; namespace FuncDemo { class Program { static void Main(string[] args) { //无参数的fan ...

  10. Linux常用指令全集

    Linux简介及Ubuntu安装 常见指令 系统管理命令 打包压缩相关命令 关机/重启机器 Linux管道 Linux软件包管理 vim使用 用户及用户组管理 文件权限管理 大牛笔记-www.weix ...