POJ3279 Fliptile(暴力)
有一种暴力是这样的,枚举一边,确定另一边。
这一题是这么解的,枚举第一行所有翻转情况,然后剩下几行其实是确定的,因为前i行翻转方式确定后只能通过第i+1行的翻转来改变第i行的状态,于是依次模拟求出剩下几行的翻转情况。
另外其实每个点最多只会被翻转一次,因为如果翻转两次和不翻转是一样的。
这题很有意思。
#include<cstdio>
#include<cstring>
using namespace std; int n,m,sta[][],op[][]; void flip(int x,int y){
int dx[]={,,,-};
int dy[]={,-,,}; sta[x][y]^=;
for(int i=; i<; ++i){
int nx=x+dx[i],ny=y+dy[i];
if(nx< || nx>=n || ny< || ny>=m) continue;
sta[nx][ny]^=;
}
}
bool isOK(){
for(int i=; i<n; ++i){
for(int j=; j<m; ++j) if(sta[i][j]) return ;
}
return ;
}
int doit(){
int cnt=;
for(int i=; i<n-; ++i){
for(int j=; j<m; ++j){
if(sta[i][j]){
flip(i+,j);
op[i+][j]=;
++cnt;
}
}
}
if(isOK()) return cnt;
else return ;
}
int main(){
int init[][],ans[][];
scanf("%d%d",&n,&m);
for(int i=; i<n; ++i){
for(int j=; j<m; ++j) scanf("%d",&init[i][j]);
}
int res=;
for(int i=; i<(<<m); ++i){
memcpy(sta,init,sizeof(init));
memset(op,,sizeof(op));
int cnt=;
for(int j=; j<m; ++j){
if((i>>j)&){
flip(,m-j-);
op[][m-j-]=;
++cnt;
}
}
cnt+=doit();
if(res>cnt){
res=cnt;
memcpy(ans,op,sizeof(op));
}
}
if(res==) puts("IMPOSSIBLE");
else{
for(int i=; i<n; ++i){
for(int j=; j<m; ++j){
printf("%d ",ans[i][j]);
}
putchar('\n');
}
}
return ;
}
POJ3279 Fliptile(暴力)的更多相关文章
- POJ-3279.Fliptile(二进制状态压缩 + dfs) 子集生成
昨天晚上12点刷到的这个题,一开始一位是BFS,但是一直没有思路.后来推了一下发现只需要依次枚举第一行的所有翻转状态然后再对每个情况的其它田地翻转进行暴力dfs就可以,但是由于二进制压缩学的不是很透, ...
- POJ3279 Fliptile —— 状态压缩 + 模拟
题目链接:http://poj.org/problem?id=3279 Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submiss ...
- [POJ3279]Fliptile(开关问题,枚举)
题目链接:http://poj.org/problem?id=3279 题解:http://www.cnblogs.com/helenawang/p/5538547.html /* ━━━━━┒ギリギ ...
- POJ3279 Fliptile 枚举+简单搜索
题意:一个矩阵,每个点1或0,然后每次翻一个点,它周围上下左右(包括自己)1->0,0->1,问最少翻几次可以矩阵全是0,忽略题目说的字典序 分析:枚举第一行所有的情况,然后下面几行也随之 ...
- poj3279 Fliptile
思路: 枚举. 枚举了第一行的操作之后,下面每行的操作也随之确定了.因为在确定了第i行的操作之后,要想再改变a[i][j]的状态只能通过改变a[i + 1][j]来实现.另外,用到了集合的整数表示方法 ...
- Fliptile POJ-3279 DFS
题目链接:Fliptile 题目大意 有一个01矩阵,每一次翻转(0->1或者1->0)一个元素,就会把与他相邻的四个元素也一起翻转.求翻转哪些元素能用最少的步骤,把矩阵变成0矩阵. 思路 ...
- Fliptile [POJ3279] [开关问题]
题意 给定一张n*m的方格图,有1,0两种数字,每次可以选取一个十字进行翻转,1变成0,0变成1,问最少需要翻转几次,使它全部变成0,全部如果有重复的,按字典序最小的进行输出: 输入 第一行n,m 下 ...
- (POJ-3279)Fliptile (dfs经典---也可以枚举)
Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He ha ...
- 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 ...
随机推荐
- linux系统的学习
通过<鸟哥的linux私房菜>的学习,自己得到的收获! 关机与重启 shutdown -k now "message" 用以发送所有信息,并不是真的关机.还可以登录新的 ...
- ArcGIS将Nodata区设置为0
两个栅格进行叠加,有时会有一部分没有数据,即用identify点击该区域,Value为NoData,而不是像其他非空区域一样有值.此时注意nodata区域要赋予0值,因为nodata+任何数=noda ...
- 如何刷新或清除HttpURLConnection的连接缓存
项目需要定期与远程服务器同步数据,基于如下代码: URL url = new URL("http://test.com/sales/info"); connection = (Ht ...
- HTML5视频播放
1.检测浏览器是否支持html5视频播放 <!doctype html> <html> <head> <meta charset="utf-8&qu ...
- JS之Form表单相关操作
获取ID组件的值 var userid=document.getElementById('userid').value;var cdkey=document.getElementById('cdkey ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- 微信网页版APP - 网页微信客户端电脑版体验
微信网页版很早就出来了,解决了很多人上班不能玩手机的问题.微信电脑版-网页微信客户端,直接安装在桌面的微信网页版,免去了开浏览器的麻烦.双击就启动了,和其他的应用程序一样:运行过程中可以隐藏在桌面右下 ...
- 利用 PhpStorm、Idea 等 IDE 如何 运行/调试 Go 程序 ?
以自己常用的 PhpStorm 为例 第一步:下载安装 Go插件 File -> Settings -> Plugins -> 输入关键字:Go 第二步:新建 Go项目 File - ...
- CentOS6.3安装MongoDB2.2 及 安装PHP的MongoDB客户端
下载源码:(放到 /usr/local/src 目录下) 到官网 http://www.mongodb.org/downloads 下载源码 https://fastdl.mongodb.org/li ...
- Swift3.0P1 语法指南——方法
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...