POJ.3279 Fliptile (搜索+二进制枚举+开关问题)

题意分析

题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置(如果有)的0变成1,1变成0。现在求需要按多少次,才能使得整个map全部变成0。

此题解法与 UVA.11464 Even Parity 有异曲同工之妙。

首先可以看出,最多每个位置按一次,因为再按的话,相当于没按。如果我们枚举每一个位置是否按的话,2^(n*n)的复杂度爆炸。

接着思考,其实相对来说,下一行是否按,可以根据上一行的情况来决定。举个例子,如果上一行为1,那么下一行是一定要按的,按之后可以让上一行变成0.那么下下一行也是这个道理。

所以可以仅仅枚举第一行,就可以一次判断出来整个棋盘哪个位置按了,哪个没按。

说道这里可见这个题是有开关问题的性质。

至于如何枚举第一行,这里涉及到二进制枚举的方法,有兴趣的读者可以直接看UVA.11464 Even Parity或者从网上找相关资料,这里不再赘述。

需要注意的一点是,要判断最后一行是否全部为0,如果不是白色,说明这种方案不可行。要舍弃。

代码总览

#include <cstdio>
#include <algorithm>
#include <cstring>
#define nmax 20
#define inf 1000000
using namespace std;
int mp[nmax][nmax],flip[nmax][nmax],ans[nmax][nmax];
int spx[5] = {0,0,1,0,-1};
int spy[5] = {0,1,0,-1,0};
int m,n;
int ret = 0;
bool check(int x, int y)
{
if(x>=0 && x <m && y>=0 && y<n) return true;
else return false;
}
int handle(int x, int y)
{
int temp = mp[x][y];
for(int i = 0;i<5;++i){
int nx = x + spx[i];
int ny = y + spy[i];
if(check(nx,ny)){
temp+=flip[nx][ny];
}
}
return temp % 2; }
int Process()
{
for(int i = 1;i<m;++i){
for(int j = 0;j<n;++j){
if(handle(i-1,j)){
flip[i][j] = 1;
}
}
}
for(int i = 0;i<n;++i){
if(handle(m-1,i)) return inf;
}
int temp = 0;
for(int i = 0;i<m;++i){
for(int j = 0;j<n;++j){
temp+=flip[i][j];
}
}
return temp;
}
void update()
{
for(int i = 0;i<m;++i){
for(int j = 0;j<n;++j){
ans[i][j] = flip[i][j];
}
}
}
int main()
{
while(scanf("%d %d",&m,&n) != EOF){
memset(mp,0,sizeof(mp));
memset(ans,0,sizeof(ans));
for(int i = 0;i<m;++i){
for(int j = 0;j<n;++j)
scanf("%d",&mp[i][j]);
}
ret = inf;
int temp = 0;
for(int i = 0;i<(1<<n);++i){
memset(flip,0,sizeof(flip));
for(int j = 0;j<n;++j){
flip[0][j] = 1&(i>>j);
}
temp = Process();
if(temp < ret){
ret = temp;
update();
}
}
if(ret == inf) printf("IMPOSSIBLE\n");
else{
for(int i = 0;i<m;++i){
for(int j = 0;j<n;++j){
if(j == 0) printf("%d",ans[i][j]);
else printf(" %d",ans[i][j]);
}
printf("\n");
}
} }
return 0;
}

POJ.3279 Fliptile (搜索+二进制枚举+开关问题)的更多相关文章

  1. POJ 3279 Fliptile (二进制+搜索)

    [题目链接]click here~~ [题目大意]: 农夫约翰知道聪明的牛产奶多. 于是为了提高牛的智商他准备了例如以下游戏. 有一个M×N 的格子,每一个格子能够翻转正反面,它们一面是黑色,还有一面 ...

  2. (简单) POJ 3279 Fliptile,集合枚举。

    Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more ...

  3. 状态压缩+枚举 POJ 3279 Fliptile

    题目传送门 /* 题意:问最少翻转几次使得棋子都变白,输出翻转的位置 状态压缩+枚举:和之前UVA_11464差不多,枚举第一行,可以从上一行的状态知道当前是否必须翻转 */ #include < ...

  4. POJ 3279 Fliptile(翻格子)

    POJ 3279 Fliptile(翻格子) Time Limit: 2000MS    Memory Limit: 65536K Description - 题目描述 Farmer John kno ...

  5. POJ 3279 Fliptile(反转 +二进制枚举)

    Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13631   Accepted: 5027 Descrip ...

  6. poj 3279 Fliptile(二进制搜索)

    Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He ha ...

  7. POJ 3279 Fliptile (二进制枚举)

    <题目链接> <转载于 >>> > 题目大意: 给定一个M*N矩阵,有些是黑色(1表示)否则白色(0表示),每翻转一个(i,j),会使得它和它周围4个格变为另 ...

  8. poj 3279 Fliptile(二进制)

    http://poj.org/problem?id=3279 在n*N的矩阵上,0代表白色,1代表黑色,每次选取一个点可以其颜色换过来,即白色变成黑色,黑色变成白色,而且其上下左右的点颜色也要交换,求 ...

  9. POJ - 3279 Fliptile(反转---开关问题)

    题意:有一个M*N的网格,有黑有白,反转使全部变为白色,求最小反转步数情况下的每个格子的反转次数,若最小步数有多个,则输出字典序最小的情况.解不存在,输出IMPOSSIBLE. 分析: 1.枚举第一行 ...

随机推荐

  1. 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(中)

    接<基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)> 三.代码分析 1.界面初始化 bool PlaneWarGame::init() { bool bRet = fals ...

  2. ffmpeg 踩坑实录 安装与视频切片(一)

    这段时间一直在做一个关于视频处理的项目.其中有一块需要切片相关功能.于是采用了ffmpeg来完成相关需求. 第一,ffmpeg的安装. 首先下载官方包,我这里用的是ffmpeg-release-64b ...

  3. Python接口测试实战4(上) - 接口测试框架实战

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  4. HackRF One硬件架构及参数简介

    本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 HackRF链接:https://item.taobao.com/item.htm?spm=a1z10.1- ...

  5. grunt requireJS 的基础配置

    module.exports = function(grunt){ //grunt的配置我就不叨叨了 自己看官网就ok了 //我就介绍下grunt的依赖插件grunt-contrib-requirej ...

  6. 高可用Kubernetes集群-1. 集群环境

    参考文档: 部署kubernetes集群1:https://github.com/opsnull/follow-me-install-kubernetes-cluster 部署kubernetes集群 ...

  7. hadoop之Shuffle和Sort

    MapRduce保证reducer的输入是按照key进行排过序的,原因和归并排序有关,在reducer接收到不同的mapper输出的有序数据后,需要再次进行排序,然后是分组排序,如果mapper输出的 ...

  8. PIL包中图像的mode参数

    在这里的第一篇. 这篇的是为了说明PIL库中图像的mode参数. 我做的事情是: 在本地找了jpg的图,convert为不同mode,将不同的图截取做了个脑图,有个直观的感觉吧. 把不同mode的图通 ...

  9. vs2017 asp.net FriendlyUrls 新特性

    这个包如何使用呢?其实很简单,只需将nuget包添加到项目中,再调用routes.EnableFriendlyUrls(),你就可以通过/Foo来访问/Foo.aspx了!你也能够利用URL片段将更多 ...

  10. 基于 Agent 的模型入门:Python 实现隔离仿真

    2005 年诺贝尔经济学奖得主托马斯·谢林(Thomas Schelling)在上世纪 70 年代就纽约的人种居住分布得出了著名的 Schelling segregation model,这是一个 A ...