BZOJ 1647 [Usaco2007 Open]Fliptile 翻格子游戏:部分枚举 位运算
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1647
题意:
在一个n*m(1 <= n,m <= 15)的棋盘上,每一个格子里都有一个可以翻转的棋子。
棋子的一面是黑色,一面是白色。
若翻转一个棋子,则它周围的四个棋子也会被翻转。
问你最少需要多少次翻转,使所有的棋子都变成白面向上。
如果可以做到,输出字典序最小的结果(将结果当成字符串处理)。如果不能做到,输出“IMPOSSIBLE”。
题解:
首先有一个结论:
如果第i-1行第j列的棋子为黑,那么第i行j列的棋子一定会被翻转,因为只有这样上一行的黑棋子才能变成白棋子。
所以,如果上一行的棋子状态已经确定,那么当前行的翻转方案是唯一确定的。
因此,如果第1行的棋子状态确定,接下来2到n行的方案也都唯一确定了。
所以只用枚举第1行的棋子状态,复杂度O(2^15)。
注:如果用状态压缩state枚举表示第一行的状态的话,state的第0位代表棋盘的第m-1列。
因为要按字典序从小到大枚举。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 20
#define INF 10000000 using namespace std; const int dx[]={-,,,};
const int dy[]={,,-,}; int n,m;
int a[MAX_N][MAX_N];
int t[MAX_N][MAX_N];
int cnt[MAX_N][MAX_N];
int ans[MAX_N][MAX_N];
bool failed=false; void read()
{
cin>>n>>m;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cin>>a[i][j];
}
}
} inline bool is_legal(int x,int y)
{
return x>= && x<n && y>= && y<m;
} void solve()
{
int minn=INF;
for(int state=;state<(<<m);state++)
{
memset(cnt,,sizeof(cnt));
memcpy(t,a,sizeof(int)*MAX_N*MAX_N);
int tot=;
for(int j=;j<m;j++)
{
int pos=m-j-;
if((state>>pos)&)
{
t[][j]^=;
cnt[][j]=;
tot++;
for(int k=;k<;k++)
{
int x=dx[k];
int y=j+dy[k];
if(is_legal(x,y)) t[x][y]^=;
}
}
}
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
if(t[i-][j])
{
t[i][j]^=;
cnt[i][j]=;
tot++;
for(int k=;k<;k++)
{
int x=i+dx[k];
int y=j+dy[k];
if(is_legal(x,y)) t[x][y]^=;
}
}
}
}
bool is_white=true;
for(int j=;j<m;j++)
{
if(t[n-][j])
{
is_white=false;
break;
}
}
if(is_white && tot<minn)
{
memcpy(ans,cnt,sizeof(int)*MAX_N*MAX_N);
minn=tot;
}
}
if(minn==INF) failed=true;
} void print()
{
if(failed)
{
cout<<"IMPOSSIBLE"<<endl;
return;
}
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cout<<ans[i][j];
if(j!=m-) cout<<" ";
}
cout<<endl;
}
} int main()
{
read();
solve();
print();
}
BZOJ 1647 [Usaco2007 Open]Fliptile 翻格子游戏:部分枚举 位运算的更多相关文章
- bzoj 1647: [Usaco2007 Open]Fliptile 翻格子游戏【dfs】
这个可以用异或高斯消元,但是我不会呀我用的暴搜 2的m次方枚举第一行的翻转情况,然后后面的就定了,因为对于一个j位置,如果i-1的j位置需要翻,那么一定要翻i的j,因为这是i-1的j最后翻的机会 按字 ...
- 1647: [Usaco2007 Open]Fliptile 翻格子游戏
1647: [Usaco2007 Open]Fliptile 翻格子游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 423 Solved: 173[ ...
- 【BZOJ】1647: [Usaco2007 Open]Fliptile 翻格子游戏(暴力)
http://www.lydsy.com/JudgeOnline/problem.php?id=1647 自己太弱...看题解.. 竟然是枚举第一行的放法,,,因为一定要全部变0,所以将前一行1的在这 ...
- [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,那么第二行的每一个格子的操 ...
- [Usaco2007 Open]Fliptile 翻格子游戏 状态压缩
考试想到了状压,苦于T1废掉太长时间,于是默默输出impossible.. 我们知道,一个格子的翻转受其翻转次数和它相邻翻转次数的影响. 由每一个位置操作两次相当于把它翻过来又翻回去,所以答案中每一个 ...
- [Usaco2007 Open]Fliptile 翻格子游戏 状压dp
n,m<=15,直接搞肯定不行,考虑一行一行来, 每一行的状态只与三行有关,所以从第一行开始枚举,每一次让下面一行填上他上面那行的坑 最后一行必须要同时满足他自己和他上面那行,否则舍去 #inc ...
- [BZOJ 1647][USACO 2007 Open] Fliptile 翻格子游戏
1647: [Usaco2007 Open]Fliptile 翻格子游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 702 Solved: 281[ ...
随机推荐
- Python 可视化Twitter中指定话题中Tweet的词汇频率
CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-8 @author: guaguastd @name: pl ...
- 有用PHP依赖管理工具Composer新手教程
PHP依赖管理工具Composer新手教程 Composer 是 PHP 的一个依赖管理工具.它同意你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 依赖管理 Composer 不是一个包管理 ...
- C#面试:抽象类与接口
本人近日面试遇到此等问题.然后又一次补习了一下下.希望对同行们有所帮助. 一.抽象类: 抽象类是特殊的类,仅仅是不能被实例化:除此以外.具有类的其它特性:重要的是抽象类能够包括抽象方法,这 ...
- vue2.0 仿手机新闻站(五)全局的 loading 组件
1.组件结构 index.js const LoadingComponent = require('./Loading.vue') const loading = { install: functio ...
- ZOJ - 3890 Wumpus(BFS基础题)
Wumpus Time Limit: 2 Seconds Memory Limit: 65536 KB One day Leon finds a very classic game call ...
- 配置fio支持rbd測试引擎
fio的rbd測试引擎能够非常方便的对rbd进行測试.以下示范怎样安装fio支持rbd引擎. git clone git://git.kernel.dk/fio.git $ cd fio $ ./co ...
- ORACLE经常使用系统查询
1 查询系统全部对象 SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, CREATED, LAST_DDL_TIME, TIMESTAMP, STATUS FRO ...
- jQuery源代码 框架分析
每个框架都有一个核心.全部的结构都是基于这个核心之上,结构建立好了之后,剩下的就是功能的堆砌. jQuery的核心就是从HTML文档中匹配元素并对其操作. 就跟一座大楼一样.让我们一步一步了解这座大厦 ...
- 编写mipsel mt7620 Led驱动(一)
1.看原理图中知芯片上66引脚控制一个LED 2.在Datasheet中找出GPIO pin 3.在ProgrammingGuid System Contrl中找到GPIO控制寄存器地址: 4.控制 ...
- 目标检测之vibe---ViBe(Visual Background extractor)背景建模或前景检测
ViBe算法:ViBe - a powerful technique for background detection and subtraction in video sequences 算法官网: ...