【POJ - 3279】Fliptile(经典翻转问题)
-->Fliptile
直接中文翻译:
Descriptions:
给你一个01矩阵,矩阵大小为M x N。(1 <= M , N <= 15)
每次操作选择一个格子,使得该格子与上下左右四个格子的值翻转。
至少多少次操作可以使得矩阵中所有的值变为0?
请输出翻转方案,若没有方案,输出"IMPOSSIBLE” 。
若有多种方案符合题意,请首先输出翻转次数最少的方案;若方案个数仍不唯一,则输出字典序最小的方案。
Input
第一行输入两个数:M和N。(1 <= M , N <= 15)
接下来M行,每行N个数,其值只为0或1。
Output
输出M行,每行N个数。
每个数代表该位置翻转次数
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
题目链接:
https://vjudge.net/problem/POJ-3279
先按字典顺序枚举第一行的全部可能,再去推第2行,第3行......把这些行全部推成0,最后看最后一行,如果最后一行都是0,则成功,记录翻转次数。否则失败
AC代码:
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 20
using namespace std;
int result;
int n,m;
int mp[Maxn][Maxn];//原始地图
int tmp[Maxn][Maxn];//当前操作的地图
int ans[Maxn][Maxn];//最优解地图
int dt[][] = { { -, }, { , }, { , }, { , - }, { , } };//5个方向
int getcolor(int x,int y)//得到(x,y)的颜色
{
int cnt=mp[x][y];
for(int i=; i<; i++)
{
int tx=dt[i][]+x;
int ty=dt[i][]+y;
if(tx>=&&tx<n&&ty>=&&ty<m)
cnt+=tmp[tx][ty];
}
return cnt%;
}
int solve()
{
int cnt=;
for(int i=; i<n; i++)//从第二行开始检查是否需要翻转
for(int j=; j<m; j++)
if(getcolor(i-,j))
tmp[i][j]=;
for(int i=; i<m; i++)//检查最后一行是否全为0
if(getcolor(n-,i))
return INF;
for(int i=; i<n; i++)//统计翻转次数
for(int j=; j<m; j++)
cnt+=tmp[i][j];
return cnt;
}
int main()
{
result=INF;
cin>>n>>m;
for(int i=; i<n; i++)
for(int j=; j<m; j++)
cin>>mp[i][j];
for(int i=; i<<<m; i++)//按照字典序枚举第一行所以翻转可能
{
MEM(tmp,);//初始化地图
for(int j=; j<m; j++)
tmp[][j]= i>>(m-(j+)) & ;//第一行的状态
int sum=solve();//翻转的次数
if(sum<result)//更新地图
{
result=sum;
memcpy(ans,tmp,sizeof tmp);//tmp数组复制到ans
}
}
if(result==INF)
cout<<"IMPOSSIBLE"<<endl;
else//输出
{
for(int i=; i<n; i++)
{
for(int j=; j<m; j++)
cout<<ans[i][j]<<" ";
cout<<endl;
}
}
}
【POJ - 3279】Fliptile(经典翻转问题)的更多相关文章
- 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 (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...
- POJ 3279(Fliptile)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...
- poj 3279 Fliptile (简单搜索)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16558 Accepted: 6056 Descrip ...
- 【POJ 3279 Fliptile】开关问题,模拟
题目链接:http://poj.org/problem?id=3279 题意:给定一个n*m的坐标方格,每个位置为黑色或白色.现有如下翻转规则:每翻转一个位置的颜色,与其四连通的位置都会被翻转,但注意 ...
- 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 - 3279 Fliptile (枚举)
http://poj.org/problem?id=3279 题意 一个m*n的01矩阵,每次翻转(x,y),那么它上下左右以及本身就会0变1,1变0,问把矩阵变成全0的,最小需要点击多少步,并输出最 ...
- poj 3279 Fliptile(二进制)
http://poj.org/problem?id=3279 在n*N的矩阵上,0代表白色,1代表黑色,每次选取一个点可以其颜色换过来,即白色变成黑色,黑色变成白色,而且其上下左右的点颜色也要交换,求 ...
- POJ 3279 Fliptile[二进制状压DP]
题目链接[http://poj.org/problem?id=3279] 题意:给出一个大小为M*N(1 ≤ M ≤ 15; 1 ≤ N ≤ 15) 的图,图中每个格子代表一个灯泡,mp[i][j] ...
随机推荐
- 【51nod 1245】Binomial Coefficients Revenge
题目大意 C(M,N) = M! / N! / (M - N)! (组合数).给出M和质数p,求C(M,0), C(M,1)......C(M,M)这M + 1个数中,有多少数不是p的倍数,有多少是p ...
- Remote API(RAPI)之 系统信息
RAPI提供了一些取系统信息的函数 CeGetSystemInfo:返回当前系统信息 CeGetSystemMetrics:获取Windows元素的尺寸和系统设置 CeGetVersionEx:获取当 ...
- jquery animate()方法 语法
jquery animate()方法 语法 作用:animate() 方法执行 CSS 属性集的自定义动画.该方法通过CSS样式将元素从一个状态改变为另一个状态.CSS属性值是逐渐改变的,这样就可以创 ...
- java+大文件上传+下载
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
- Codeforces 1167 E Range Deleting 双指针+思维
题意 给一个数列\(a\),定义\(f(l,r)\)为删除\(a\)中所有满足\(l<=a_i<=r\)的数后的数列,问有多少对\((l,r)\),使\(f(l,r)\)是一个 ...
- Java线程之如何分析死锁及避免死锁
什么是死锁 java中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java死锁情况出现至少两个线程和两个或更多资源. 在这里,我们将写了一个简单的程序,它将导致java死锁场景,然后我们将分析 ...
- vuex和localStorage的存储区别
vuex中的数据是存储在内存中的,localStorage中的数据是存储在浏览器的application中的
- zookeeper系列(三)zookeeper的使用--开源客户端
作者:leesf 掌控之中,才会成功:掌控之外,注定失败, 原创博客地址:http://www.cnblogs.com/leesf456/ 奇文共欣赏,大家共同学习进步. 一.前言 上一篇博客已 ...
- JVM 监控工具——jstatd
1. 简介 jstatd是一个rmi的server应用,用于监控jvm的创建和结束,并且提供接口让监控工具(如visualvm)可以远程连接到本机的jvms . 注意是jvms,就是说运行jstatd ...
- SRS之监听端口的管理:RTMP
1. 监听端口管理的入口函数 监听端口的管理入口在 run_master 函数中,如下: int run_master() { ... if ((ret = _srs_server->liste ...