POJ 3279 Fliptile[二进制状压DP]
题目链接【http://poj.org/problem?id=3279】
题意:给出一个大小为M*N(1 ≤ M ≤ 15; 1 ≤ N ≤ 15) 的图,图中每个格子代表一个灯泡,mp[i][j] = 0;表示(i,j)这盏灯灭,反之则亮。如果把反转(i,j)等的开关,那么这个灯和他上下左右的等都会变成原来相反的的状态。
问:用最少的使用开关的次数使得灯全部被熄灭。
思路:用0,1表示第一行每个位置是否使用开关,所有状态最多有(1<<15)-1种,如果第一行的状态确定了,其他行的开关状态也就确定了。即:当第一行开关反转过后,那么如果第一行(i,j)灯为0,呢么下一行(i+1,j)灯的开关就不能反转,反之必须反转,只有这样,当前行的灯才能被全灭。所以,枚举第一行的所有状态,逐层向下模拟,最后判断最后一行是否被全灭即可,同时维护最小值的状态即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int INF = 1e5;
const int maxn = << ;
int mp[][];
int t[][];
int ans[][];
int n, m;
int dir[][] = {, , , , , -, -, };
bool check()
{
for(int j = ; j <= m; j++)
if(t[n][j]) return ;
return ;
}
void init()
{
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
t[i][j] = mp[i][j];
}
int flip(int x, int y)
{
t[x][y] ^= ;
for(int i = ; i <= ; i++)
{
int X = x + dir[i][];
int Y = y + dir[i][];
if(X >= && X <= n && Y >= && Y <= m)
t[X][Y] ^= ;
}
}
int tap(int k)
{
init();
int num = ;
//处理第一行
for(int i = ; k; i++)
{
if(k & )
flip(, i), num++;
k >>= ;
}
//处理后面的行数
for(int i = ; i < n; i++)
for(int j = ; j <= m; j++)
{
if(t[i][j])
flip(i + , j), num++;
}
return num;
}
void tap2(int k)
{
init();
memset(ans, , sizeof(ans));
for(int i = ; k; i++)//第一行
{
if(k & )
flip(, i), ans[][i] = ;
k >>= ;
}
for(int i = ; i < n; i++)
for(int j = ; j <= m; j++)
{
if(t[i][j])
flip(i + , j), ans[i + ][j] = ;
}
}
int main ()
{
while(~scanf("%d%d", &n, &m))
{
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
scanf("%d", &mp[i][j]);
int mask = ( << m) - ;
int T = INF;
for(int i = ; i <= mask; i++)
{
int num = tap(i);//反转
if(check() && num < T)
{
T = num;
tap2(i);//记录反转
}
}
if(T == INF)
printf("IMPOSSIBLE\n");
else
{
for(int i = ; i <= n; i++)
{
for(int j = ; j < m; j++)
printf("%d ", ans[i][j]);
printf("%d\n", ans[i][m]);
}
}
}
return ;
}
POJ 3279 Fliptile[二进制状压DP]的更多相关文章
- POJ 3254 Corn Fields (状压dp)
题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...
- POJ 3254 - Corn Fields - [状压DP水题]
题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...
- [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp
题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...
- poj 3254Corn Fields (入门状压dp)
Farmer John has purchased a lush ≤ M ≤ ; ≤ N ≤ ) square parcels. He wants to grow some yummy corn fo ...
- POJ 1684 Corn Fields(状压dp)
描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...
- POJ 2923 Relocation(状压DP)题解
题意:有2辆车运货,每次同时出发,n(<10),各自装货容量c1 c2,问最少运几次运完. 思路:n比较小,打表打出所有能运的组合方式,用背包求出是否能一次运走.然后状压DP运的顺序. 代码: ...
- POJ 2411 Mondriaan's Dream/[二进制状压DP]
题目链接[http://poj.org/problem?id=2411] 题意:给出一个h*w的矩形1<=h,w<=11.用1*2和2*1的小矩形去填满这个h*w的矩形,问有多少种方法? ...
- Poj - 3254 Corn Fields (状压DP)(入门)
题目链接:https://vjudge.net/contest/224636#problem/G 转载于:https://blog.csdn.net/harrypoirot/article/detai ...
- poj 3279 Fliptile(二进制)
http://poj.org/problem?id=3279 在n*N的矩阵上,0代表白色,1代表黑色,每次选取一个点可以其颜色换过来,即白色变成黑色,黑色变成白色,而且其上下左右的点颜色也要交换,求 ...
随机推荐
- 一个view相对于屏幕或者另外一个view 的坐标
如果想知道一个view相对于屏幕或者另外一个view 的坐标,那么可以通过如下的方法得到: UIWindow * window=[[[UIApplication sharedApplication] ...
- Struts2中实现文件上传的功能
1.首先得配置一下Struts得配置文件struts-xml: <?xml version="1.0" encoding="UTF-8" ?> &l ...
- Dreamweaver层使用八定律
当然,这些并非真正的定律,而只是一些有益的忠告,使你免陷于使用层时可能的困顿中.原来有九条定律的,我们精简掉一条,还有下面的八条: 1. 如果你要嵌套层,决不要使用多重父层,应共享一个共同的单一父层. ...
- 常见dos命令
打开控制面板:win+r control 服务: win+r services.msc
- FORM提交请求后自动打开输出EDITOR_PKG.REPORT
DECLARE p_mode_request_id number := 1; p_ERRBUF VARCHAR2(250); p_RETCODE NUMBER; lv_msg varchar2(50) ...
- x264宏块及子块划分方式
1 宏块划分方式 一副图像(帧,非场图像,x264支持宏块级场编码,这里以帧图像为例说明)按从左到右.从上到下16x16的方式划分宏块,对于图像宽度不是16的倍数的情况,会扩展至16的倍数,然后通过s ...
- java运行时数据区域
数据区域有:程序计步器,虚拟机栈,本地方法栈,java堆,方法区 程序计步器: 它是一块较小的内存空间,它的作用可以看做是当先线程所执行的字节码的信号指示器. 每一条JVM线程都有自己的PC寄存器,各 ...
- Mysql基础知识整
web项目部署 Java项目使用的web服务器:Tomcat.weblogic.webshare.jetty Php.python使用的web服务器:nginx.apache 搭建环境过程: 部署.发 ...
- 利用虚函数减少导出DLL的头文件依赖
概要 设想这样一个场景:我有一个类FunClass,它的声明位于FunClass.h,并且在FunClass.h中,我还引用了secret.h. 现在我需要把FunClass导出成DLL文件供别人二次 ...
- Unity3D研究院之在把代码混淆过的游戏返混淆回来(七十七)
最近一直在找如何在MAC上混淆Android的DLL,至今没能找到合适的,有大神知道记得告诉我喔.今天群里有人说了一个混淆代码和返混淆代码的工具de4dot ,不查不知道一查吓一跳.这玩意可以把别人混 ...