POJ 1753 Flip Game (状压+暴力)
题目链接: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 (状压+暴力)的更多相关文章
- POJ 1753 Flip Game 状态压缩,暴力 难度:1
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4863 Accepted: 1983 Descript ...
- 枚举 POJ 1753 Flip Game
题目地址:http://poj.org/problem?id=1753 /* 这题几乎和POJ 2965一样,DFS函数都不用修改 只要修改一下change规则... 注意:是否初始已经ok了要先判断 ...
- POJ 1324 Holedox Moving (状压BFS)
POJ 1324 Holedox Moving (状压BFS) Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 18091 Acc ...
- POJ 1753 Flip Game(高斯消元+状压枚举)
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45691 Accepted: 19590 Descr ...
- 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 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- POJ 3254 Corn Fields (状压dp)
题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...
- POJ 3254 - Corn Fields - [状压DP水题]
题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...
- HDU 5765 Bonds 巧妙状压暴力
题意:给一个20个点无向连通图,求每条边被多少个极小割集包括 分析:极小割集是边的集合,很显然可以知道,极小割集恰好吧原图分成两部分(这个如果不明白可以用反证法) 然后就是奉上官方题解:http:// ...
- [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp
题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...
随机推荐
- [Git] 009 逆转未来
1. 想逆转未来,得先知道时间线 1.1 git log 1.2 git log --oneline 此命令的显示结果比 git log 简洁 1.3 git reflog 此命令显示的记录比前两者完 ...
- MySQL 中 limit 的使用
需要注意的是,在Oracle中不使用limit,Oracle 使用rownum select no,name from emp limit 5 取前5条记录, select no,name from ...
- nginx 499错误
原因: 服务响应时间太长,客户端自动断开链接. 解决: 1. 找到响应世间长的接口,看依赖的数据源(数据库,第三方接口等)响应时间是否超时,还是自己程序有逻辑问题. 可以通过加入日志打印时间消耗来确定 ...
- BZOJ 1875(DP+矩阵快速幂)
题面 传送门 分析 容易想到根据点来dp,设dp[i][j]表示到i点路径长度为j的方案数 状态转移方程为dp[i][k]=∑(i,j)∈Edp[j][k−1]" role="pr ...
- React父子组件间的传值
父组件: import React, { Component } from 'react'; import Child from './chlid'; class parent extends Com ...
- VINS 估计器之外参初始化
为何初始化外参 当外参完全不知道的时候,VINS也可以在线对其进行估计(rotation),先在processImage内进行初步估计,然后在后续优化时,会在optimize函数中再次优化. 如何初始 ...
- Log4Net 之将自定义属性记录到文件中 (三)
原文:Log4Net 之将自定义属性记录到文件中 (三) 即解决了将自定义属性记录到数据库之后.一个新的想法冒了出来,自定义属性同样也能记录到文件中吗?答案是肯定的,因为Log4Net既然已经考虑到了 ...
- node开发一个接口详细步骤
最近在做后台系统改版,由于目前接口还没出来,就自己用nodejs写了个简单的接口. 我这里用的是nodejs+mysql的 这里不讲nodejs和mysql的安装.这些基础略过. 首先创建文件夹.cd ...
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) - A
题目链接:http://codeforces.com/contest/831/problem/A 题意:给定一个序列,问你这个序列是否是单峰的. 定义单峰的序列为: (序列值的变化趋势)开始是递增的, ...
- mv 移动或重命名文件
1. 命令功能 mv:移动或改文件名 2. 语法格式 mv [option] source dest mv 选项 源文件 目标文件 参数 参数说明 -f 如果目标文件存在,则不会询问而是直接覆 ...