POJ - 3279 Fliptile (枚举)
http://poj.org/problem?id=3279
题意
一个m*n的01矩阵,每次翻转(x,y),那么它上下左右以及本身就会0变1,1变0,问把矩阵变成全0的,最小需要点击多少步,并输出最小字典序的操作。
分析
爆搜铁定超时。。。对于一个格子,要么反转一次,要么反转零次。反转的顺序不改变最终结果。那么我们试着枚举第一行的反转情况(状态压缩),此时能影响第一行的只有第二行的格子了,依次类推,一行一行来。最后检测最后一行的值,就知道了此状态可行不可行。枚举时可以确定反转的字典序从小到大。
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define repx(i,x,e) for(int i=(x);i<=(e);i++)
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pd(a) printf("%d\n",a)
#define scl(a) scanf("%lld",&a)
#define scll(a,b) scanf("%lld%lld",&a,&b)
#define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
using namespace std;
typedef long long ll;
template <class T>
void test(T a){cout<<a<<endl;}
template <class T,class T2>
void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
template <class T,class T2,class T3>
void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const ll mod = 1e9+;
int T;
void testcase(){
printf("Case %d: ",++T);
}
const int MAXN = 3e5+;
const int MAXM = ;
int dx[]={-,,,,};
int dy[]={,-,,,};
int g[][];
int ans[][],tmp[][];
int n,m; bool check(int x,int y){
if(x<||x>=n||y<||y>=m) return false;
return true;
}
int get(int x,int y){
int res=g[x][y];
for(int i=;i<;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(check(nx,ny))
res+=tmp[nx][ny];
}
return res&;
}
int cal(){
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(get(i-,j)){
tmp[i][j]=;
}
}
}
for(int i=;i<m;i++) if(get(n-,i)) return inf;
int res=;
for(int i=;i<n;i++){
for(int j=;j<m;j++){
res+=tmp[i][j];
}
}
return res; }
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
scdd(n,m);
for(int i=;i<n;i++){
for(int j=;j<m;j++){
scd(g[i][j]);
}
}
int res=inf;
mset(ans,);
for(int i=;i<(<<m);i++){
mset(tmp,);
for(int j=;j<m;j++){
tmp[][j]= i>>j&;
}
int temp=cal();
if(temp<res){
res=temp;
for(int x=;x<n;x++){
for(int y=;y<m;y++){
ans[x][y]=tmp[x][y];
}
}
}
}
if(res==inf) puts("IMPOSSIBLE");
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 (枚举)的更多相关文章
- POJ.3279 Fliptile (搜索+二进制枚举+开关问题)
POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...
- 状态压缩+枚举 POJ 3279 Fliptile
题目传送门 /* 题意:问最少翻转几次使得棋子都变白,输出翻转的位置 状态压缩+枚举:和之前UVA_11464差不多,枚举第一行,可以从上一行的状态知道当前是否必须翻转 */ #include < ...
- POJ 3279 Fliptile(翻格子)
POJ 3279 Fliptile(翻格子) Time Limit: 2000MS Memory Limit: 65536K Description - 题目描述 Farmer John kno ...
- POJ 3279(Fliptile)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...
- POJ 3279 - Fliptile - [状压+暴力枚举]
题目链接:http://poj.org/problem?id=3279 Sample Input 4 4 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 Sample Output 0 ...
- POJ 3279 Fliptile(反转 +二进制枚举)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13631 Accepted: 5027 Descrip ...
- (简单) POJ 3279 Fliptile,集合枚举。
Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more ...
- POJ 3279 Fliptile (二进制枚举)
<题目链接> <转载于 >>> > 题目大意: 给定一个M*N矩阵,有些是黑色(1表示)否则白色(0表示),每翻转一个(i,j),会使得它和它周围4个格变为另 ...
- POJ 3279 Fliptile【枚举】
题意: 又是农夫和牛的故事...有m*n个黑白块,黑块的背面是白块,白块背面是黑块,一头牛踩一块,则这个块的上下左右的方块都会转动,问至少踩多少块,才会使所有块都变成白色? 分析: 还是开关问题,同样 ...
随机推荐
- Linux curl 一例
root@PC-RENGUOQIANG:~# curl http://kermit:kermit@192.168.66.182:8080/activiti-rest/service/repositor ...
- mysql的group_concat对应oracle的wm_concat
mysql的group_concat对应oracle的wm_concat http://bey2nd.blog.163.com/blog/static/12063183120124313360964/
- Mybatis复杂嵌套关联一例
Mybatis three entity relation:association in collection PatentMapper.xml <resultMap id="Bas ...
- [转帖]什么是Asp.net Core?和 .net core有什么区别?
什么是Asp.net Core?和 .net core有什么区别? https://www.cnblogs.com/itzhangxp/p/8322364.html 知道微软开始用 kestrel了 ...
- [读书笔记]Linux命令行与shell编程读书笔记02 环境变量以及其他
1. Linux的环境变量. 全局环境变量的查看 printenv 一个结果示例 XDG_SESSION_ID=354TERM=xtermSHELL=/bin/bashSSH_CLIENT=10.24 ...
- PRML读书笔记_绪论
一.基本名词 泛化(generalization) 训练集所训练的模型对新数据的适用程度. 监督学习(supervised learning) 训练数据的样本包含输入向量以及对应的目标向量. 分类( ...
- HTML页面打印
<style media=print>.Noprint{display:none;}</style> <object id="WebBrowser" ...
- 基于C#.NET的高端智能化网络爬虫(二)(攻破携程网)
本篇故事的起因是携程旅游网的一位技术经理,豪言壮举的扬言要通过他的超高智商,完美碾压爬虫开发人员,作为一个业余的爬虫开发爱好者,这样的言论我当然不能置之不理.因此就诞生了以及这一篇高级爬虫的开发教程. ...
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 4. 函数
什么样的程序员才是优秀的程序员?咪博士认为“慵懒”的程序员才是真正优秀的程序员.听起来不合逻辑?真正优秀的程序员知道如何高效地工作,而不是用不止境的加班来完成工作任务.函数便是程序员高效工作的利器之一 ...
- 使用嵌入式jetty实现文件服务器
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...