[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 ...
随机推荐
- Centos使用vsfotd配置fpt服务
---恢复内容开始--- vsftp简介 vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面. ...
- My new life
第一次开始写博客,也是在学长的建议下想要正式的写的.有点小激动,这篇博客标志着一个新的开始,它将记录下我学习编程的生活,也象征着我将向着自己渴望的方向发展.不过这篇博客就真的是一篇随笔哈哈. 希望我的 ...
- Visual Studio 2017离线安装包下载、安装
1. 首先下载在线安装exe,官网地址https://www.visualstudio.com/zh-hans/downloads/ 2. 运行CMD, 执行脚本 vs_enterprise.exe ...
- axis1.4开发webservice客户端(快速入门)-基于jdk1.4
写在前面: 对于客户端,服务端开发好了以后,客户端只需要调用就可以了.这里我们讲的是,根据服务的访问地址,来生成客户端所需要用到的代码(听说有几种调用方式,但是用到最常见的就是stub方式,貌似我说的 ...
- ubuntu12.0.4安装启动后无法进入图形操作界面
在VMware10.0.4虚拟机上安装ubuntu12.0.4版本后,启动linux后,无法进入图形界面,但是可以进入字符界面.通过查阅网上资料,有人说是VMware的3D图形加速没有关闭,于是通过查 ...
- Python爬虫从入门到放弃(十二)之 Scrapy框架的架构和原理
这一篇文章主要是为了对scrapy框架的工作流程以及各个组件功能的介绍 Scrapy目前已经可以很好的在python3上运行Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是 ...
- java基础系列--Exception异常处理
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7191280.html 1.概述 Java代码中的异常处理是非常重要的一环,从代码中可以看到 ...
- nopCommerce 3.9 大波浪系列 之 IWebHelper
接口:Nop.Core.IWebHelper 实现:Nop.Core.WebHelper 测试:Nop.Core.Tests.WebHelperTests 简介:Web辅助类 功能:获取客户端IP地址 ...
- synchronized优化
重量级锁 synchronized关键字 前文解释了synchronized的实现和运用,了解monitor的作用,但是由于monitor监视器锁的操作是基于操作系统的底层Mutex Lock实现的, ...
- iOS tableView刷新
下面是我对AFN刷新一个简单的封装我们只需要传过去一个tableView就好了 简化了一些代码 #import <Foundation/Foundation.h> typedef NS_E ...