文章目录

  • 题目解答
  • 题目来源

题目解答


分析:

  1. 枚举第一行,指的是第一行哪些位置要切换状态!!!。第一行总共有5个数,组合数是32,即第一行哪些位置要切换总共有32种情况。这就是我们的枚举空间。比如,k = 0 表示第一行就这样,不切换状态。k = 2,二进制是 00010,就表示 数组g[][]的第一行第2个灯要切换状态。

  2. 这里的逻辑是:完成一件事A --> C ,拆分成两步,先从A --> B ,再从B – >C ,总共需要的花费就是两步之和。这里的A --> B 就是从g[][]变成第一行的新状态,需要的反转次数;这里的B – >C就是从第一行的新状态开始往下翻转,直到所有的灯都亮需要的反转次数。

采用的测试用例

00111
01011
10001
11010
11100

对了,这里对memcpy()函数稍作解释
memcpy(dest, src, 字节数),指的是把src数组复制到dest数组,并且需要指定字节数。

比如

memcpy(backup, g, sizeof g); // 把g数组复制到backup数组

另外,这里解释一下异或操作,在代码中的体现是turn函数中用到了,把’0’变成’1’,把’1’变成’0’. 异或操作在配偶操作中很常见,是一种技巧,比如在求反向路径的时候。

 char a = '0', b = a ^ 1;char c = '1', d = c ^ 1;cout << b << endl;cout << d << endl;/*
输出为
1
0
*/

这里的过程是这样的: ‘0’的Ascii值是48, 48 和1 异或(48的二进制表示是多少呢?然后如何求抑或呢?请读者自行验证。48 二进制: 110000 ,和1 异或得到 110001)得到的是49,正好是49,对应的字符是’1’.

ac代码


#include<bits/stdc++.h>
using namespace std;
const int  INF = 100000000;char g[10][10];
int dx[5] = {0, -1, 0, 1, 0}, dy[5] = {0, 0, 1, 0, -1};// 反转灯
void turn(int x, int y){for(int i = 0; i < 5; i ++){int a = x + dx[i], b = y + dy[i];if( a >= 0 && a < 5 && b >=0 && b < 5){g[a][b] ^= 1;// 48 变成 49 即 '0'变成'1','1'变成'0'}}
}int work(){int ans = INF;// 枚举第一行哪些需要切换状态!// 第一行共有32种状态for(int k = 0; k < 1 << 5; k ++){int  res = 0; // 统计翻转次数char backup[10][10];memcpy(backup, g, sizeof g); // g数组copy到backup数组中// 把g[][]数组按照枚举的第一行状态进行更改// 如果k的某一位为1,表示g[][]数组第一行的这些位要切换状态!// 然后依次往下递推,以便找到最少的步数。for(int j = 0; j < 5; j ++){if( k >> j & 1){res ++;turn(0, j);}}//逐行递推for(int i = 0; i < 4; i++)for(int j = 0; j < 5; j++){if( g[i][j] == '0'){res ++;turn(i + 1 , j);}}// 看最后一行是否全1bool is_successful = true;for(int i = 0; i< 5; i ++)if(g[4][i] == '0'){is_successful = false;break;}if(is_successful)  ans  = min(ans, res);memcpy(g, backup, sizeof backup);}if( ans > 6) ans = -1;return ans;
}int main(){int T;cin >> T;while( T --){for(int i = 0; i < 5; i ++) cin >> g[i];cout << work() << endl;}
}

题目来源

https://www.acwing.com/problem/content/97/

《算法竞赛进阶指南》打卡-基本算法-AcWing 95. 费解的开关:位运算、枚举、递推相关推荐

  1. 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

    文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...

  2. 金字塔(算法竞赛进阶指南)

    虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. 经过多年的研究,科学家对这座金字塔的内部结构已经有所了解. 首先,金字塔由若干房间组成,房间之间连有通道. 如果把房间看作节点, ...

  3. 《算法竞赛进阶指南》数论篇

    <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSG ...

  4. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  5. CH5202 自然数拆分Lunatic版(算法竞赛进阶指南,完全背包)

    算法竞赛进阶指南,278页,完全背包 本题要点: 1.把完全背包的代码改改即可.常规的完全背包: 有n个物品,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值(每 ...

  6. 中位数--《算法竞赛进阶指南》(货仓选址和七夕祭问题详解)

    中位数 今天又和大家见面了啦~ 依旧是 <算法竞赛进阶指南>的学习哦~ 中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本.种群或概 ...

  7. AcWing 122. 糖果传递【贪心】【《算法竞赛进阶指南》,微软面试题 , HAOI2008】

    AcWing 122. 糖果传递 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 122. 糖果传递 进阶题目 AcWing 105 ...

  8. 算法竞赛进阶指南 骑士放置

    4: 最大独立集 :选出最多的点,使得选出的点之间没有边. 求最大独立集:选出最小的点可以破坏所有的边 <==>最小点覆盖 <==>最大匹配数. 假设最大匹配数为m,共有n个点 ...

  9. 算法竞赛进阶指南 萌新入门!

    算法竞赛进阶指南 文章目录 算法竞赛进阶指南 前言 一.介绍本书 二.如何阅读本书 三.总结 **笔记思路和结构 ** 算法竞赛进阶指南 这篇文章就简单的写一下吧! 前言 ​ 作为一个想要入坑的算法的 ...

最新文章

  1. ​简单四步,快速判断真菌是否成功侵染宿主植物
  2. 分布式服务动态上下线感知
  3. math库是python语言的数学模块_Python 数学模块(Math)
  4. 不用到处找图标了!模库承包你所有的图标素材!
  5. views.py视图函
  6. C++ 不能在类体外指定关键字static
  7. 有关于类的定义赋值与调用总结
  8. 阿里云云计算 10 ECS的使用
  9. 菲波那切数列java_斐波那契数列—java实现
  10. 轴承系统动力学模型matlab程序代码
  11. Python3爬虫实战——QQ空间自动点赞程序(上)
  12. 微软私有云资源链接总结分享
  13. 拉格朗日插值公式与mathematica程序实现
  14. html图片左右滑动代码dw,DW图片无缝滚动代码
  15. 阿里天池大数据竞赛(杂)
  16. 软件配置一套键鼠控制两台电脑
  17. sinc插值原理及其实现
  18. 《打造高绩效团队》读书笔记
  19. 基于Servlet+jsp+mysql开发javaWeb学生成绩管理系统
  20. SpringMVC-详解

热门文章

  1. 十天学会AngularJS之02
  2. UVA 10229 Modular Fibonacci
  3. 字符转十六进制 String = HEX using hexdump on linux
  4. 如何卸载Windows 7中的IE10并还原到IE9
  5. 本人常用的基础 linux命令
  6. centos7输入shell找不到命令_反弹shell原理与实现
  7. html空格代码_编写灵活、稳定、高质量的CSS代码的规范(推荐收藏)
  8. 【控制】粒子群优化(PSO,Particle Swarm Optimization)算法及 Matlab 仿真实现
  9. 【Paper】2004_Information Flow and Cooperative Control of Vehicle Formations
  10. 2.3 快速搭建你的第一个系统,并进行迭代-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授