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. zigbee路由(报文实例)

    4855 广播  routeRequestId = 6, pathCost = 0 radius=1E 62BB 继续广播 routeRequestId = 6, pathCost = 1 radiu ...

  2. python-redis集合模式

    无序集合SADD set集合是直接去重的,只会输出 xiao hehe sadd  names3  xiao xiao hehe  hehe 获取集合 names3的所有值,集合不能用切片形式获取值, ...

  3. New begin

    Purpose 今天更换了id,希望重新沉淀. 晚上看到国外一个博客,落款有个中文: 敬惜字纸. 共勉.

  4. 第一次ScrumMeeting博客:团队任务分解

    团队任务分解 1. 主要任务 Alpha阶段结束后,我们要实现一个较为简陋的用户系统,并实现资源的上传和下载功能,完成"贡献点"相关内容并进行用户行为观察,以便Beta阶段完善.除 ...

  5. 深度系统(deepin)与win10双系统切换设置

    之前在win10下安装了深度系统,我不知道其他人在双系统切换的时候是否需要更改BIOS参数,我根据我的实际情况给出双系统切换设置的解决方案. 1.开机后进入选项System setup 2.按照下图选 ...

  6. Beta阶段第2周/共2周 Scrum立会报告+燃尽图 04

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2412 版本控制地址    [https://git.coding.net/ ...

  7. AOP:spring 的Annotation配置

    1.文件目录: 2.实体类 package com.wangcf.po; public class User { private int id; private String name; privat ...

  8. 【SSH框架】之Struts2系列(一)

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系 1.Struts2框架概述 (1).什么是Struts2 Struts2是一种基于MVC模式的轻量 ...

  9. 配置java环境 启动服务

    1:查看当前的Java JDK版本,是否符合要求,下载的为2.4.4版本,因此满足条件 [root@7 ~]# java -version openjdk version "1.8.0_65 ...

  10. linux虚拟机发邮件给163邮件

    配置/etc/mail.rc文件 set from=xxxxxxxx@163.com smtp=smtp.163.com set smtp-auth-user=yinhuanyi_cn@163.com ...