[Usaco2007 Open]Fliptile 翻格子游戏 状态压缩
考试想到了状压,苦于T1废掉太长时间,于是默默输出impossible。。
我们知道,一个格子的翻转受其翻转次数和它相邻翻转次数的影响。
由每一个位置操作两次相当于把它翻过来又翻回去,所以答案中每一个点操作次数为0或1。
然后我们枚举第一行的状态,1代表翻转,0代表不翻转。
如果与它相连的点的操作次数和它本身状态之和为偶数,它就会被翻成白色。
由于我们从上向下推,所以对于上一行的点来说,只有它下面那一个点不确定,我们就让下面这一个点进行能够让上一行点满足全为白色的操作。
这样推到最后一行,前面m-1行都满足,我们只需要看最后一行是否满足就可以了。
最后一行满足,就说明这种方案合法,再去更新之前存下的合法方案就可以了。
例如此位置本身与上左右状态之和为偶数,而此位置在初始时是1,所以我们需要把它翻成0,需要奇数个操作,所以我们把它下面的状态设置为1即可。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define pos(i,a,b) for(int i=(a);i<=(b);i++) #define N 20 int n,m; int a[N][N],temp[N][N],ans[N][N]; int work(int i){ pos(j,1,n){ if(j==1){ pos(k,1,m) if((1<<(m-k))&i){ temp[j][k]=1; } } pos(k,1,m){ if(j!=n){ if((temp[j][k-1]+temp[j][k+1]+temp[j-1][k]+temp[j][k])%2==0){ if(a[j][k]){ temp[j+1][k]=1; } else{ temp[j+1][k]=0; } } else{ if(a[j][k]==0){ temp[j+1][k]=1; } else{ temp[j+1][k]=0; } } } if(j==n){ if((temp[j][k-1]+temp[j][k+1]+temp[j-1][k]+temp[j][k])%2==0){ if(a[j][k]){ return 0; } } else{ if(!a[j][k]) return 0; } } } } return 1; } int flag; int count(){ int sum1=0,sum2=0;; pos(i,1,n){ pos(j,1,m){ if(temp[i][j]) sum1++; if(ans[i][j]) sum2++; } } if(sum1<sum2) return 1; return 0; } void update(){ if(flag){ if(count()){ pos(i,1,n) pos(j,1,m) ans[i][j]=temp[i][j]; } else{ pos(i,1,n){ pos(j,1,m){ if(temp[i][j]<ans[i][j]){ pos(k,1,n){ pos(l,1,m){ ans[k][l]=temp[k][l]; } } } else{ return; } } } } } else{ pos(i,1,n) pos(j,1,m) ans[i][j]=temp[i][j]; flag=1; } } int main(){ //freopen("fliptile.in","r",stdin); //freopen("fliptile.out","w",stdout); scanf("%d%d",&n,&m); pos(i,1,n){ pos(j,1,m){ scanf("%d",&a[i][j]); } } pos(i,0,(1<<m)-1){ memset(temp,0,sizeof(temp)); if(work(i)){ update(); } else{ continue; } } if(flag){ pos(i,1,n){ pos(j,1,m){ cout<<ans[i][j]<<" "; } cout<<endl; } } else{ cout<<"IMPOSSIBLE"; } return 0; }
[Usaco2007 Open]Fliptile 翻格子游戏 状态压缩的更多相关文章
- 1647: [Usaco2007 Open]Fliptile 翻格子游戏
1647: [Usaco2007 Open]Fliptile 翻格子游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 423 Solved: 173[ ...
- [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 ...
- 【BZOJ 1647】[Usaco2007 Open]Fliptile 翻格子游戏 模拟、搜索
第一步我们发现对于每一个格子,我们只有翻和不翻两种状态,我们发现一旦确定了第一行操作,那么第二行的操作也就随之确定了,因为第一行操作之后我们要想得到答案就得把第一行全部为0,那么第二行的每一个格子的操 ...
- 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 翻格子游戏(暴力)
http://www.lydsy.com/JudgeOnline/problem.php?id=1647 自己太弱...看题解.. 竟然是枚举第一行的放法,,,因为一定要全部变0,所以将前一行1的在这 ...
- [Usaco2007 Open]Fliptile 翻格子游戏 状压dp
n,m<=15,直接搞肯定不行,考虑一行一行来, 每一行的状态只与三行有关,所以从第一行开始枚举,每一次让下面一行填上他上面那行的坑 最后一行必须要同时满足他自己和他上面那行,否则舍去 #inc ...
- 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 ...
随机推荐
- Example002定时打开窗口
<!--实例002定时打开窗口--> <script> // 3秒后弹出窗口: function time() { window.open("index.html&q ...
- ORA-01157,记一次Oracle故障恢复过程
生产环境中有两台部署PowerCenter的ETL业务机,近期发现无法通过客户端连接到ETL服务. 初步怀疑是PowerCenter挂掉了,或者资料库出现了故障. 登陆设备后发现PowerCenter ...
- 利用fputcsv导出数据备份数据
今天,分享一个利用fputcsv导出数据备份数据的方法,我也时看到些零零散散的代码,想着拼起来,所以我只提供些思路,以及简单的代码,至于怎么组合能够让它更强大,尽情去探索吧 讲之前先上一段获取数据库里 ...
- 在linux环境下tomcat 指定 jdk或jre版本
最近在服务器上部署的服务出了点问题,后来查到是因为JDK版本太高了,程序识别不了,需要把JDK降级. 但是服务器上面跑的程序很多,又不能直接把环境变量改了,所以只能想着怎么把这个出问题的工程服务指定j ...
- Express 学习笔记纯干货(Routing、Middleware、托管静态文件、view engine 等等)
原始文章链接:http://www.lovebxm.com/2017/07/14/express-primer/ 1. Express 简介 Express 是基于 Node.js 平台,快速.开放. ...
- 关于shell脚本函数、数组、字符串截取、svn更新发布实例
#/bin/bash #功能:QA服根据模板创建区配置文件并提交到svn上. SOURCE_PATH=/data/source_code SVN_PATH=/code/psm #svn发布目录,要 ...
- C# 实现语音听写
本文系原创,禁止转载. 分享如何使用c#对接科大讯飞语音听写服务,简单高效地实现语音听写. 实现语音听写主要分为录音和语音识别两部分:录音是指获取设备声卡端口的音频数据并将之保存为音频文件,语音识别就 ...
- 事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
一.事件冒泡定义 事件冒泡是指在一个对象触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那 ...
- jenkins IOS- ad-hoc 打包
背景 客户无大企业证书,只有开发者证书,如果进行开发分发测试只能采用两种方式 testfight ad-hoc打包 上testfight存在一定的审核时间,排除掉,最后选择打ad-hoc的包 解决 查 ...
- (转)Bat Command
1.Echo 命令 打开回显或关闭请求回显功能,或显示消息.如果没有任何参数,echo 命令将显示当前回显设置.语法 echo [{on|off}] [message] Sample篅echo off ...