描述:

一个\(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(开关后续)的更多相关文章

  1. Fliptile [POJ3279] [开关问题]

    题意 给定一张n*m的方格图,有1,0两种数字,每次可以选取一个十字进行翻转,1变成0,0变成1,问最少需要翻转几次,使它全部变成0,全部如果有重复的,按字典序最小的进行输出: 输入 第一行n,m 下 ...

  2. POJ--3279(开关问题2个不同时间写的代码)

    Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19730   Accepted: 7118 Descrip ...

  3. [POJ3279]Fliptile(开关问题,枚举)

    题目链接:http://poj.org/problem?id=3279 题解:http://www.cnblogs.com/helenawang/p/5538547.html /* ━━━━━┒ギリギ ...

  4. 逗比的wifi开关

    笔记本会出现网卡开机不能用的现象.具体表现为:网卡没有禁用,但是搜索不到无线信号.适配器选项框里面选中无线网卡,然后诊断这个链接提示启用无线功能.然后我点击应用此修复就能搜索到无线信号了.问题是,电脑 ...

  5. android自定义控件(2)-拖拽实现开关切换

    在这里,我们的主要工作就是在原有代码的基础上,增加一个重写的onTouchEvent方法,刚添加上来的时候是这个样子的: @Override public boolean onTouchEvent(M ...

  6. bootstrap-switch:记一次很坑的问题(连续相同状态的多行数据只有第一个显示按钮,其他行没有开关初始化)

    先上截图,第234行都是禁用状态,但是只有第2行显示了禁用开关,后面的都没有开关初始化 检查下代码: onLoadSuccess: function(data){ {#获取行数据的状态#} conso ...

  7. 订单业务楼层化 view管理器和model管理器进行了model和view的全面封装处理 三端不得不在每个业务入口上线时约定好降级开关,于是代码中充满了各种各样的降级开关字段

    京东APP订单业务楼层化技术实践解密 原创 杜丹 留成 博侃 京东零售技术 2020-09-29 https://mp.weixin.qq.com/s/2oExMjh70Kyveiwh8wOBVA 用 ...

  8. 通过暗码去打开/关闭usb debug开关

    通过暗码去打开/关闭usb debug开关 通过暗码去打开/关闭usb debug开关1. Description2. Analysis3. Solution4. Summary 1. Descrip ...

  9. vue自定义switch开关,使用less支持换肤

    实际项目用到了,记录一下,也方便以后使用,这样也可以避免为了使用一个switch,引入整个外部web框架: 也可以方便更好的理解是和使用less. 基础代码使用的是网上的,然后自己添加了less换肤, ...

随机推荐

  1. 【Selenium06篇】python+selenium实现Web自动化:日志处理

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第六篇博 ...

  2. ******Prometheus(二)***********

    Prometheus的数据与安全模型: (1)Metric (度量)名字就是描述采集数据的名称——例如,website_visits_total 作为网站访问总数.名称可以包含ASCII字母.数字.下 ...

  3. Vue中el-form标签中的自定义el-select下拉框标签

    页面写死el-select下拉框标签: 通过v-for="item in stateArr"绑定,stateArr声明在Vue组件里面的data参数里面代码如下: <el-f ...

  4. matlab计算样本熵

    计算14通道得脑电数据吗,将得出的样本熵插入Excel表格 a = zeros(1,14); b = a'; for i =1:14 b(i) = SampEn(d1_1(i,1:3000),2,0. ...

  5. 搞懂 XML 解析,徒手造 WEB 框架

    恕我斗胆直言,对开源的 WEB 框架了解多少,有没有尝试写过框架呢?XML 的解析方式有哪些?能答出来吗?! 心中没有答案也没关系,因为通过今天的分享,能让你轻松 get 如下几点,绝对收获满满. a ...

  6. SVN版本控制器的使用说明(详细过程)

    SVN使用教程总结  SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subv ...

  7. Java前台传值至后台中文乱码

    记一次常见问题 今天导入了一个网上下载的项目,运行后发现,前台传值 到Servlet,Servlet保存至数据库,数据库保存的中文数据出现乱码,检查了一下表中的编码是utf8没错. 输出测试了一下 原 ...

  8. Yii2.0 rules常用验证规则

    设置一个修改方法,但是save(),没有成功,数据修改失败,查了好久,一般情况就是不符合rules规则,而我没有设置rules规则,重新设置了一个不能为空,然后就修改成功,rules里面什么也不写,也 ...

  9. tensorflow1.0 placeholder占位符

    import tensorflow as tf #(tf.float32,[2,2]) input1 = tf.placeholder(tf.float32) input2 = tf.placehol ...

  10. thinkphp5 不使用form,用input+ajax异步上传图片

    不支持$this->request->file()获取图片 后台接收文件请使用$_FILE 正文开始: HTML <div class="upload"> ...