POJ3279(开关后续)
描述:
一个\(n*m的矩阵,每个格子有0和1两种状态.每次可以翻一个格子,并且此格子的上下左右都要被翻。\)
\(目标状态应该全为0,求最少翻的次数,输出最小字典序的方案\)
这儿可就麻烦了啊,开关从一维变到了二维,不能通过确定左上角的状态往后递推
但是,我们可以枚举第一行的状态,第二行怎么翻就确定了,因为此时上面的格子只有下面的格子可以改变
Ⅰ.枚举和预处理
关于枚举第一行,可以用二进制数很方便的表示出来
同样f[i][j]表示(i,j)位置有没有被翻过,那我们统计一下上下左右被翻的次数就可以的得知此时状态
最后,判断第N行是否全为0即可。
#include <cstring>
#include <iostream>
using namespace std;
const int inf=1<<29;
int n,m,ans,a[20][20],f[20][20],s[20][20];
int b[5]={0,0,1,-1},c[5]={1,-1,0,0};
bool isfilp(int x,int y)
{
int k=f[x][y]+a[x][y];//统计被翻过的次数
for(int i=0;i<4;i++)
{
int nx=x+b[i],ny=y+c[i];
if(nx<1||ny<1||nx>n||ny>m) continue;
k+=f[nx][ny];
}
return k%2;
}
int cal()
{
int ans=0;
for(int i=2;i<=n;i++)
for(int j=1;j<=m;j++)
if(isfilp(i-1,j))//如果需要翻转
f[i][j]=1;
for(int i=1;i<=m;i++)
if(isfilp(n,i)) return -1;//最后一行还要被翻,显然不可行
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans+=f[i][j];
return ans;
}
int main()
{
while(cin>>n>>m)
{
ans=inf;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
int last=1<<m;
for(int i=0;i<last;i++)
{
memset(f,0,sizeof(f));
for(int j=1;j<=m;j++)
if(i&(1<<(j-1)))
f[1][j]=1;//初始化第1行
int val=cal();
if(val==-1) continue;
if(val<ans)
{
ans=val;
memcpy(s,f,sizeof(f));//把方案保存下来
}
}
if(ans==inf) cout<<"IMPOSSIBLE"<<endl;
else
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<s[i][j]<<" ";
cout<<endl;
}
}
}
return 0;
}
POJ3279(开关后续)的更多相关文章
- Fliptile [POJ3279] [开关问题]
题意 给定一张n*m的方格图,有1,0两种数字,每次可以选取一个十字进行翻转,1变成0,0变成1,问最少需要翻转几次,使它全部变成0,全部如果有重复的,按字典序最小的进行输出: 输入 第一行n,m 下 ...
- POJ--3279(开关问题2个不同时间写的代码)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19730 Accepted: 7118 Descrip ...
- [POJ3279]Fliptile(开关问题,枚举)
题目链接:http://poj.org/problem?id=3279 题解:http://www.cnblogs.com/helenawang/p/5538547.html /* ━━━━━┒ギリギ ...
- 逗比的wifi开关
笔记本会出现网卡开机不能用的现象.具体表现为:网卡没有禁用,但是搜索不到无线信号.适配器选项框里面选中无线网卡,然后诊断这个链接提示启用无线功能.然后我点击应用此修复就能搜索到无线信号了.问题是,电脑 ...
- android自定义控件(2)-拖拽实现开关切换
在这里,我们的主要工作就是在原有代码的基础上,增加一个重写的onTouchEvent方法,刚添加上来的时候是这个样子的: @Override public boolean onTouchEvent(M ...
- bootstrap-switch:记一次很坑的问题(连续相同状态的多行数据只有第一个显示按钮,其他行没有开关初始化)
先上截图,第234行都是禁用状态,但是只有第2行显示了禁用开关,后面的都没有开关初始化 检查下代码: onLoadSuccess: function(data){ {#获取行数据的状态#} conso ...
- 订单业务楼层化 view管理器和model管理器进行了model和view的全面封装处理 三端不得不在每个业务入口上线时约定好降级开关,于是代码中充满了各种各样的降级开关字段
京东APP订单业务楼层化技术实践解密 原创 杜丹 留成 博侃 京东零售技术 2020-09-29 https://mp.weixin.qq.com/s/2oExMjh70Kyveiwh8wOBVA 用 ...
- 通过暗码去打开/关闭usb debug开关
通过暗码去打开/关闭usb debug开关 通过暗码去打开/关闭usb debug开关1. Description2. Analysis3. Solution4. Summary 1. Descrip ...
- vue自定义switch开关,使用less支持换肤
实际项目用到了,记录一下,也方便以后使用,这样也可以避免为了使用一个switch,引入整个外部web框架: 也可以方便更好的理解是和使用less. 基础代码使用的是网上的,然后自己添加了less换肤, ...
随机推荐
- Git应用详解第七讲:Git refspec与远程分支的重要操作
前言 前情提要:Git应用详解第六讲:Git协作与Git pull常见问题 这一节来介绍本地仓库与远程仓库的分支映射关系:git refspec.彻底弄清楚本地仓库到底是如何与远程仓库进行联系的. 一 ...
- 逆拓扑排序 Reward HDU - 2647
Reward HDU - 2647 题意:每个人的起始金额是888,有些人觉得自己做的比另一个人好所以应该多得一些钱,问最少需要花多少钱,如果不能满足所有员工的要求,输出 -1 样例1: 2 1 1 ...
- 2019-05-19 Python之第一个爬虫和测试
一.使用request和get访问某个网页20次并且打印返回状态,内容 扩展:常见状态码含义 200 - 服务器成功返回网页,404 - 请求的网页不存在,403(禁止)服务器拒绝请求,404(未 ...
- delphi 捕捉全局异常错误的方法
private { Private declarations } public procedure GlobalExceptionHandler(Sender: TObject; E: ...
- 浏览器中 JS 的事件循环机制
目录 事件循环机制 宏任务与微任务 实例分析 参考 1.事件循环机制 浏览器执行JS代码大致可以分为三个步骤,而这三个步骤的往复构成了JS的事件循环机制(如图). 第一步:主线程(JS引擎线程)中执行 ...
- vue2.x学习笔记(二)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12555836.html. 声明式渲染 vue的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进DOM的系统. ...
- 嵌入css方式
总体见思维导图 . 嵌入css方式 1 内联式 内联式css样式表就是把css代码直接写在现有的HTML标签中,如下面代码: <p style="color:red"> ...
- requets中urlencode的问题
前言 今天团队群里有师傅问requests怎么设置不解码,这里是语误,其实师傅想说的是,如果设置不编码. 一开始我没懂,然后师傅们解答了这个问题后,我想了会儿懂了. 在一些CTF题目中,可能会碰到这样 ...
- Chrome 浏览器安装 ChroPath 插件
1.下载地址 http://www.cnplugins.com/devtool/chropath/download.html 2.安装方法 a.把下载的文件更改后缀名变为压缩包,然后解压到本地:如下图 ...
- auth权限逻辑
下面本人为大家讲解一下如何实现auth权限, 第一步,新建Auth.php,复制下面的代码,把注释中的表都创建一下.把文件放到extend新建文件夹org放进去即可, <?php // +--- ...