poj 3279 Fliptile (简单搜索)
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 16558 | Accepted: 6056 |
Description
Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows in which they manipulate an M × N grid (1 ≤ M≤ 15; 1 ≤ N ≤ 15) of square tiles, each of which is colored black on one side and white on the other side.
As one would guess, when a single white tile is flipped, it changes to black; when a single black tile is flipped, it changes to white. The cows are rewarded when they flip the tiles so that each tile has the white side face up. However, the cows have rather large hooves and when they try to flip a certain tile, they also flip all the adjacent tiles (tiles that share a full edge with the flipped tile). Since the flips are tiring, the cows want to minimize the number of flips they have to make.
Help the cows determine the minimum number of flips required, and the locations to flip to achieve that minimum. If there are multiple ways to achieve the task with the minimum amount of flips, return the one with the least lexicographical ordering in the output when considered as a string. If the task is impossible, print one line with the word "IMPOSSIBLE".
Input
Lines 2..M+1: Line i+1 describes the colors (left to right) of row i of the grid with N space-separated integers which are 1 for black and 0 for white
Output
Sample Input
4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1
Sample Output
0 0 0 0
1 0 0 1
1 0 0 1
0 0 0 0
题目链接:
http://poj.org/problem?id=3279
题目大意:
给你一个n*m的由0和1组成的矩阵A。一个对应的n*m的01矩阵B,若B的某元素为1,则矩阵A对应位置上下左右及自己五个位置发生反转,即0变为1,1变为0。求字典序最小的矩阵B,使得A变为全0。(做完发现该字典序是反的即从右到左,算一个坑点吧)。由于重复反转效果是一样的,所以这题理解成这样是没有错误的。
简单搜索题。
这题思路比较奇特。从i枚举到1<<n,模拟第一行的反转状态。用位运算获得每一位是1还是0。就是代码中的 i&(i<<j)。然后根据第一行的反转结果,就能完全确定接下来所有行的反转状态和反转结果。这是因为若第一行某一位反转后为1,只有通过下一行此处反转才能变为0。如此,最后只要判断最后一行是否为全0。若全为0,立即输出便是字典序最小的结果。具体细节可以参考我的代码体会一哈^_^。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue> using namespace std; int tile[][];
int ttile[][];
int oper[][]; int main()
{
int m,n;
scanf("%d%d",&m,&n);
for(int i=;i<m;i++)
for(int j=;j<n;j++)
scanf("%d",tile[i]+j); int fflag=false;
for(int i=;i<(<<n);i++)//枚举第一行的翻转
{
memcpy(ttile,tile,sizeof(tile)); for(int j=;j<n;j++)//处理第一行的翻转
{
int op;
if((i&(<<j))>)
op=oper[][j]=;
else
op=oper[][j]=;
ttile[][j]^=op;
if(j->=)
ttile[][j-]^=op;
if(j+<n)
ttile[][j+]^=op;
if(m>)
ttile[][j]^=op;
} for(int j=;j<m;j++)//处理2..m行的翻转
{
for(int k=;k<n;k++)
{
int op;
if(ttile[j-][k]==)
op=oper[j][k]=;
else
op=oper[j][k]=;
ttile[j][k]^=op;
ttile[j-][k]^=op;
if(k->=)
ttile[j][k-]^=op;
if(k+<n)
ttile[j][k+]^=op;
if(j+<m)
ttile[j+][k]^=op;
}
} int flag=true;
for(int i=;i<n;i++)//判断最后一行是否符合条件
{
if(ttile[m-][i]==)
{
flag=false;
break;
}
} if(flag)
{
fflag=true;
break;
}
} if(fflag)
{
for(int i=;i<m;i++)
for(int j=;j<n;j++)
{
if(j==n-)
printf("%d\n",oper[i][j]);
else
printf("%d ",oper[i][j]);
}
}
else
printf("IMPOSSIBLE\n");
return ;
}
poj 3279 Fliptile (简单搜索)的更多相关文章
- POJ.3279 Fliptile (搜索+二进制枚举+开关问题)
POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...
- poj 3279 Fliptile(二进制搜索)
Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He ha ...
- POJ 3279 Fliptile(翻格子)
POJ 3279 Fliptile(翻格子) Time Limit: 2000MS Memory Limit: 65536K Description - 题目描述 Farmer John kno ...
- 状态压缩+枚举 POJ 3279 Fliptile
题目传送门 /* 题意:问最少翻转几次使得棋子都变白,输出翻转的位置 状态压缩+枚举:和之前UVA_11464差不多,枚举第一行,可以从上一行的状态知道当前是否必须翻转 */ #include < ...
- POJ 3279(Fliptile)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...
- (简单) POJ 3279 Fliptile,集合枚举。
Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more ...
- POJ 3279 Fliptile (二进制+搜索)
[题目链接]click here~~ [题目大意]: 农夫约翰知道聪明的牛产奶多. 于是为了提高牛的智商他准备了例如以下游戏. 有一个M×N 的格子,每一个格子能够翻转正反面,它们一面是黑色,还有一面 ...
- 【POJ 3279 Fliptile】开关问题,模拟
题目链接:http://poj.org/problem?id=3279 题意:给定一个n*m的坐标方格,每个位置为黑色或白色.现有如下翻转规则:每翻转一个位置的颜色,与其四连通的位置都会被翻转,但注意 ...
- POJ 3279 Fliptile[二进制状压DP]
题目链接[http://poj.org/problem?id=3279] 题意:给出一个大小为M*N(1 ≤ M ≤ 15; 1 ≤ N ≤ 15) 的图,图中每个格子代表一个灯泡,mp[i][j] ...
随机推荐
- Java——内部类详解
说起内部类,大家肯定感觉熟悉又陌生,因为一定在很多框架源码中有看到别人使用过,但又感觉自己使用的比较少,今天我就带你具体来看看内部类. 内部类基础 所谓内部类就是在类的内部继续定义其他内部结构类. 在 ...
- 【Luogu P1090】合并果子
Luogu P1090 [解题思路] 刚看到这题的时候,第一反应就是每次取两个最小,然后重新排序,再取最小.但是这样会TLE. 既然找最小的,那就可以利用单调队列了.显然输入的数据是不具有单调性的,但 ...
- 一图读懂Spring Core,Spring MVC, Spring Boot,Spring Cloud 的关系与区别
Spring框架自诞生到现在,历经多次革新,形成了多种不同的产品,分别应用于不同的项目中,为了帮助自己理解这些产品之间的关系,特此整理此图,以便自己记忆和复习.
- linux 进程简介
进程相关知识简介 进程定义: 一个运行中的程序即一个process task struct: 内核存储进程信息的固定格式称为task struct,task struct记录了例如该进程内存下一跳位置 ...
- 替换节点(replaceChild())
replaceChild():方法将把一个给定父元素里面的一个子节点替换为另一个子节点: referencre = element.replaceChild(newChild,oldChild); o ...
- 4.Netty执行IO事件和非IO任务
回顾NioEventLoop的run方法流程 IO事件与非IO任务 处理IO事件 处理非IO任务 聚合定时任务到普通任务队列 从普通队列中获取任务 计算任务执行的超时时间 安全执行 计算是否超时 总结 ...
- PringData JPA一对多多对一多对多关联
一.一对多.多对一 1.Country实体类 2.City实体类 3.CountryDao层 4.CityDao层 5.Controller package com.zn.controller; im ...
- Apache用户认证、域名跳转、Apache访问日志
5月29日任务 课程内容: 11.18 Apache用户认证11.19/11.20 域名跳转11.21 Apache访问日志扩展 apache虚拟主机开启php的短标签 http://ask.apel ...
- Tomcat连接器详解
1.连接器等同于nginx中的引擎. 2.tomcat连接器有三种运行模式bio.nio.apr . (1)bio(blocking I/O,阻塞式I/O操作) 1)表示tomcat使用的是传统的ja ...
- TableViewCell的封装(显示不同内容)
http://blog.csdn.net/qq_24513939/article/details/45968123