描述:

一个\(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. hibernate.current_session_context_class 比较权威的解释

    hibernate.current_session_context_class 博客分类: hibernate HibernateSpring多线程配置管理thread  遇到过的问题: 情景1: 在 ...

  2. EXPLAIN 关键字可以 查看 sql执行 的详细过程

    EXPLAIN SELECT n_did,n_count,n_total,d_last_exchange FROM player_con_record WHERE n_roleid=1 AND n_f ...

  3. 使用Network Emulator Toolkit工具模拟网络丢包测试(上)

    弱网络测试包括延时和丢包二种场景下应用的功能是否正常: 网络延时测试使用Fiddler工具控制上下行数据传输延时时间来模拟网络延时场景: 网络丢包测试使用Network Emulator Toolki ...

  4. myvue 模拟vue核心原理

    // js部分index.js class Myvue{ constructor(options){ this.data = options.data; this.dep = new Dep(); v ...

  5. 第十三节:telnetlib、redis、threading模块

    telnetlib模块案例: import telnetlib,re class TelnetInfo(): def telnetdo(self, host, port, command): tn = ...

  6. python输出中文乱码

    首选项-浏览插件目录-USER文件夹 找到编译环境设置,编译方式为UTF-8编码 { "cmd": ["c:/Python36/python.exe",&quo ...

  7. Salesforce Spring '20新功能集锦系列(二)

    一.使用Data Mask保护沙盒数据 对于Salesforce管理员和开发人员,Data Mask是功能强大的新数据安全资源.管理员可以使用数据掩码自动加密沙盒中的数据,无需手动保护数据和沙盒组织的 ...

  8. Xshell 中文提示乱码

    1.Alt+P 打开配置对话框,点击终端->编码,选择Unicode(utf-8)编码

  9. Java 14 来势汹汹,这回让空指针无处遁形!!

    上篇:Java 14 之模式匹配,非常赞的一个新特性! 相信在坐的每一位 Java 程序员都遇到过空指针异常: NullPointerException(NPE),不甚其烦. 栈长之前也分享几篇避免空 ...

  10. winfrom 基础

    1 winfrom就是一种窗体开发端应用程序 2 窗体分类 1)记事本类:可以最大最小化,可以拖拽                                                窗体默 ...