题目描述

给定一个NM的01矩阵,每次可以选定一个位置,将它和它相邻格子的数取反。问:怎样操作使得所有格子都变为0。当有多组解时,优先取操作次数最小的;当操作次数相同时,优先取字典序最小的。

输入

第一行两个整数N和M。
接下来是一个NM的01原矩阵。
1 ≤ N,M ≤ 20

输出

输出NM的答案矩阵,若是无解则输出“ $IMPOSSlBLE$ ”

样例输入

4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1

样例输出

0 0 0 0
1 0 0 1
1 0 0 1
0 0 0 0


题解

暴力

高斯消元暴枚自由元的复杂度不会证。。。就没有写。

事实上,可以发现,如果枚举第一行怎么选的话,第一行确定了,第一行和第二行共同影响第一行,因此第二行就确定了;第二行确定了,第一、二、三行共同影响第二行,因此第三行就确定了;……;第 $n-2$ 、$n-1$ 、$n$ 行共同影响第 $n-1$ 行,因此第 $n$ 行就确定了。

所以只需要枚举第一行的选择,可以推出 $2\sim n$行的选择,然后判断第$n$ 行是否成立即可。

二进制压一行为一个数,枚举第一行的选择,然后维护第 $i$ 行选了什么(代码中的 $b[]$ ),以及选择了前 $i$ 行后第 $i$ 行的状态时什么(代码中的 $c[]$ )。如果 $c[n]=0$ 则可行,此时统计所有 $b[]$ 中1的个数即为选择的次数。

最后输出答案即可。

注意特判无解的情况,以及 $IMPOSSlBLE$ 中倒数第4个字母的情况,以及输出格式的情况。

时间复杂度 $O(n·2^m)$

#include <cstdio>
int cnt[1050000] , a[21] , b[21] , c[21] , ans[21];
int main()
{
int n , m , p , i , j , t , x , mn = 1 << 30;
scanf("%d%d" , &n , &m) , p = (1 << m) - 1;
for(i = 1 ; i <= n ; i ++ )
for(j = 1 ; j <= m ; j ++ )
scanf("%d" , &x) , a[i] = a[i] << 1 | x;
for(i = 1 ; i <= p ; i ++ ) cnt[i] = cnt[i - (i & -i)] + 1;
for(i = 0 ; i <= p ; i ++ )
{
b[1] = i , c[1] = (i ^ (i << 1) ^ (i >> 1) ^ a[1]) & p;
for(j = 2 ; j <= n ; j ++ )
b[j] = c[j - 1] , c[j] = (b[j - 1] ^ b[j] ^ (b[j] << 1) ^ (b[j] >> 1) ^ a[j]) & p;
if(!c[n])
{
t = 0;
for(j = 1 ; j <= n ; j ++ )
t += cnt[b[j]];
if(t < mn)
{
mn = t;
for(j = 1 ; j <= n ; j ++ )
ans[j] = b[j];
}
}
}
if(mn == 1 << 30) puts("IMPOSSlBLE");
else
for(i = 1 ; i <= n ; i ++ )
for(j = m - 1 ; ~j ; j -- )
printf("%d%c" , (bool)(ans[i] & (1 << j)) , j ? ' ' : '\n');
return 0;
}

【bzoj5001】搞事情 暴力的更多相关文章

  1. sql注入搞事情(连载一)

    SQL注入搞事情(连载一) 概述 写在最前面 为了有个合理的训练计划,山人准备长期开放自己的训练计划以及内容以供大家参考.山人专业是信息对抗技术,不是web方向的博客保证句句手打,如有问题请及时小窗. ...

  2. 搞事情?Spring Boot今天一口气发布三个版本

    学无止境?本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的乌托邦]逐个击 ...

  3. 教你利用Node.js漏洞搞事情

    PentestingNode.js Application : Nodejs Application Security 原文地址:http://www.websecgeeks.com/2017/04/ ...

  4. 搞事情 -- python之线程

    简介 操作系统线程理论 线程概念的引入背景 线程的特点 进程和线程的关系 使用线程的实际场景 用户级线程和内核级线程(了解) 线程和python 理论知识 线程的创建Threading.Thread类 ...

  5. python爬虫24 | 搞事情了,用 Appium 爬取你的微信朋友圈。

    昨天小帅b看到一些事情不顺眼 有人偷换概念 忍不住就写了一篇反讽 996 的 看不下去了,我支持996,年轻人就该996! 没想到有些人看不懂 这就算了 还来骂我 早些时候关注我的小伙伴应该知道我第一 ...

  6. 爱搞事情的webpack

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency g ...

  7. 周六搞事情,微信小程序开发文档已放出!

    程序员们,你们有事干了! 个人感觉不管是什么形式的UI技术,都无法决定一个产品的生死,核心还是服务和模式的创新. 某些方面和ApiCloud好像,但发展前景远远胜过ApiCloud. 微信小程序可以为 ...

  8. bootstrap,bootstrap-table,bootstrapValidator,animate,layer配合起来搞事情

    资源准备(just download) bootstrap: http://www.bootcss.com/ bootstrap-table: http://bootstrap-table.wenzh ...

  9. 【搞事情】VS2015下的openGL初始化

    环境:glfw+glew+visual studio 2015 原材料下载链接: glfw 下载 glew 下载 glm库 下载 cmake 下载 (我下载的时候有些官网戳不开(大概校园网问题)... ...

随机推荐

  1. 优步UBER司机全国各地奖励政策汇总 (2月15日-2月21日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. 成都Uber优步司机奖励政策(3月14日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. Unbuntu安装RVM

    apt-get install curl #安装rvm curl -L https://get.rvm.io | bash #执行启动 source /home/mafei/.rvm/scripts/ ...

  4. linux下免安装版本mysql5.5 配置

    进入/usr/local #cd /usr/local 下载 #wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.39-linux ...

  5. Question | 你所遇到的验证码问题可能都在这里了

    本文来自网易云社区 "Question"为网易云易盾的问答栏目,将会解答和呈现安全领域大家常见的问题和困惑.如果你有什么疑惑,也欢迎通过邮件(zhangyong02@corp.ne ...

  6. ubuntu 14.04 lts LAMP配置

    一.目标 创建服务器环境,主要包括:Apache2.4.7 serverPHP 5.5.9Mysql 5.5.49扩展:MemcacheMcrypt 二.准备工作 1.服务器系统版本 Ubuntu s ...

  7. java 创建具有参数化类型的数组

    1. List<String>[] ls; Object[] objects = ls; objects[1] = new ArrayList<Integer>(); 先把数组 ...

  8. 180626-Spring之借助Redis设计一个简单访问计数器

    文章链接:https://liuyueyi.github.io/hexblog/2018/06/26/180626-Spring之借助Redis设计一个简单访问计数器/ Spring之借助Redis设 ...

  9. centos下php环境安装redis

    一.安装redis(仅可在服务器使用,尚不能通过浏览器访问) (1)首先下载redis:wget http://download.redis.io/releases/redis-4.0.9.tar.g ...

  10. 使用python中读取配置文件

    最近在接触利用python来写测试框架,本人也是个刚接触python,所以是个小菜鸟,今天开始,一点点的记录学习中的积累,方便以后的学习以及回顾,也希望能帮助跟我一样的小菜鸟们一步步的成长起来.那么, ...