[Usaco2007 Open]Fliptile 翻格子游戏 状压dp
n,m<=15,直接搞肯定不行,考虑一行一行来,
每一行的状态只与三行有关,所以从第一行开始枚举,每一次让下面一行填上他上面那行的坑
最后一行必须要同时满足他自己和他上面那行,否则舍去
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
int n,m,a[18][18],now[18][18],tim[18][18],nxt[18],final[18],num,tot;
bool bo=0;
int getnum(int x){
int ans=0;
while(x){
ans+=x&1;
x>>=1;
}
return ans;
}
void dfs(int step,int x){
num+=getnum(x);
for(int i=m-1;i>=0;i--){
if(x&(1<<i)){
now[step][i]^=1;
if(i<m-1) now[step][i+1]^=1;
if(i>0) now[step][i-1]^=1;
if(step<n) now[step+1][i]^=1;
}
}
nxt[step+1]=0;
for(int i=m-1;~i;i--)
nxt[step+1]|=now[step][i]*(1<<i);
if(step==n){
for(int i=m-1;~i;i--)
if(now[n][i])
return;
if(num>tot) return;
bo=1; tot=num;
for(int i=1;i<=n;i++)
final[i]=nxt[i];
return;
}
dfs(step+1,nxt[step+1]);
}
int main()
{
scanf("%d%d",&n,&m);
tot=100000;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=(1<<m)-1;~i;i--){
num=0;
for(int j=0;j<m;j++)
for(int k=1;k<=n;k++)
now[k][j]=a[k][m-j];
nxt[1]=i;
dfs(1,i);
}
if(!bo){
printf("IMPOSSIBLE\n");
return 0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
printf("%d ",(final[i]>>(m-j))&1);
printf("\n");
}
return 0;
}
[Usaco2007 Open]Fliptile 翻格子游戏 状压dp的更多相关文章
- [Usaco2007 Open]Fliptile 翻格子游戏
[Usaco2007 Open]Fliptile 翻格子游戏 题目 Farmer John knows that an intellectually satisfied cow is a happy ...
- [Usaco2007 Open]Fliptile 翻格子游戏题解
问题 B: [Usaco2007 Open]Fliptile 翻格子游戏 时间限制: 5 Sec 内存限制: 128 MB 题目描述 Farmer John knows that an intell ...
- 1647: [Usaco2007 Open]Fliptile 翻格子游戏
1647: [Usaco2007 Open]Fliptile 翻格子游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 423 Solved: 173[ ...
- [Usaco2007 Open]Fliptile 翻格子游戏 状态压缩
考试想到了状压,苦于T1废掉太长时间,于是默默输出impossible.. 我们知道,一个格子的翻转受其翻转次数和它相邻翻转次数的影响. 由每一个位置操作两次相当于把它翻过来又翻回去,所以答案中每一个 ...
- 【BZOJ 1647】[Usaco2007 Open]Fliptile 翻格子游戏 模拟、搜索
第一步我们发现对于每一个格子,我们只有翻和不翻两种状态,我们发现一旦确定了第一行操作,那么第二行的操作也就随之确定了,因为第一行操作之后我们要想得到答案就得把第一行全部为0,那么第二行的每一个格子的操 ...
- 【BZOJ】1647: [Usaco2007 Open]Fliptile 翻格子游戏(暴力)
http://www.lydsy.com/JudgeOnline/problem.php?id=1647 自己太弱...看题解.. 竟然是枚举第一行的放法,,,因为一定要全部变0,所以将前一行1的在这 ...
- BZOJ 1647 [Usaco2007 Open]Fliptile 翻格子游戏:部分枚举 位运算
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1647 题意: 在一个n*m(1 <= n,m <= 15)的棋盘上,每一个格子 ...
- bzoj 1647: [Usaco2007 Open]Fliptile 翻格子游戏【dfs】
这个可以用异或高斯消元,但是我不会呀我用的暴搜 2的m次方枚举第一行的翻转情况,然后后面的就定了,因为对于一个j位置,如果i-1的j位置需要翻,那么一定要翻i的j,因为这是i-1的j最后翻的机会 按字 ...
- Fliptile 翻格子游戏
问题 B: [Usaco2007 Open]Fliptile 翻格子游戏 时间限制: 5 Sec 内存限制: 128 MB 题目描述 Farmer John knows that an intell ...
随机推荐
- 跨JavaScript对象作用域调用setInterval方法
跨JavaScript对象作用域调用setInterval方法: var id = window.setInterval(function() {foofunc.call(this);}, 200);
- subsets(子集)
Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solut ...
- 北京一家JAVA开发公司面试题(留给后人)
1.jsp有哪些内置对象?作用分别是什么? 2.描述一下servlet的生命周期和基本架构. 3.多线程有几种实现方法,都是什么? 同步有几种实现方法,都是什么? 4.作用域public priv ...
- 常常搞不清楚SQLServer中的sp_columns来看一看
The sp_columns catalog stored procedure is equivalent to SQLColumns in ODBC. The results returned ar ...
- YUV420格式解析
一般的的YUV420图像格式实际上是Y'UV,420指的是其在Y U V上面的采样率.在YUV420的格式中,首先存储每一个像素的Y'值,然后跟着存储的是每2*2方阵采样一次的U值,最后存储的是每2* ...
- JavaScript教程大纲
因为考虑到Python的接受难度,改为推广较为简单和流行的JavaScript.先列主要参考资料: JavaScript权威指南(第6版):http://book.douban.com ...
- java深入浅出之数据结构
1.整形数据 byte.short.int.long,分别是1248个字节的存储量,取值范围也是依次增大的,其中int是正负21亿多: long a = 1111222233334444L:记住后面要 ...
- Lintcode401 Kth Smallest Number in Sorted Matrix solution 题解
[题目描述] Find the kth smallest number in at row and column sorted matrix. 在一个排序矩阵中找从小到大的第 k 个整数. 排序矩阵的 ...
- 爬虫之ssh证书警告错误
错误信息: 错误信息如下: requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'tls_proce ...
- python__基础 : 类的__init__,__str__,__del__方法
__init__:当实例化一个类的时候,首相会执行__new__方法创建一个对象,接下来会执行__init__方法对对象的一些属性进行初始化. 所以如果对象有属性,一般会直接写在__init__方法里 ...