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. php引用&使用笔记

    引用与赋值是两个概念:引用是共用同一个内存地址,一个改变其他也会变,赋值是另外开辟内存空间,一个改变其他不会变 一个简单例子: $a=123; //$a开辟一个内存空间存储123 $b=&$a ...

  2. angular之$broadcast、$emit、$on传值

    文件层级 index.html <!DOCTYPE html> <html ng-app="nickApp"> <head> <meta ...

  3. CentOS7.3部署镜像仓库Harbor

    参考文档: harbor介绍:https://github.com/vmware/harbor harbor安装&使用指导:https://github.com/vmware/harbor/b ...

  4. C# 反射,动态编译

    反射是动态获取程序集的元数据的一种技术,这句话是做.NET程序员面试题目的一个的答案,你可选择记住它,就好比高中生物学里面讲到的细胞的结构的课程时,细胞由细胞膜,细胞质和细胞核组成.根据做程序的经验, ...

  5. hdu1242 Rescue DFS(路径探索题)

    这里我定义的路径探索题指 找某路能够到达目的地,每次走都有方向,由于是探索性的走 之后要后退 那些走过的状态都还原掉 地址:http://acm.hdu.edu.cn/showproblem.php? ...

  6. 设计 Azure SQL 数据库,并使用 C# 和 ADO.NET 进行连接

    标题:设计 Azure SQL 数据库,并使用 C# 和 ADO.NET 进行连接 里面有使用C#使用SqlServer的例子.

  7. 重写JdbcRDD支持Sql命名参数和分区

    Spark提供的JdbcRDD很不好用,没法指定命名参数,而且必须要提供两个Long类型的参数表示分区的范围,如果数据表没有long类型的字段或者不需要条件,那就不能用JdbcRDD了.这里我简单重写 ...

  8. Scrum 项目准备3.0

    SCRUM 流程的步骤2: Spring 计划 1. 确保product backlog井然有序.(参考示例图1) 2. Sprint周期,一个冲刺周期,长度定为两周,本学期还有三个冲刺周期. Spr ...

  9. 3dContactPointAnnotationTool开发日志(二八)

      师姐说物体间不能有穿透,于是我试了下给物体加rigidbody和meshCollider   然后就报错:   说是用meshCollider要么去掉刚体要么就把刚体设置为iskinematic. ...

  10. js获取窗口滚动条高度、窗口可视范围高度、文档实际内容高度、滚动条离浏览器底部的高度

    1.获取窗口可视范围的高度 //获取窗口可视范围的高度 function getClientHeight(){ var clientHeight=0; if(document.body.clientH ...