95. 费解的开关

题意:
  • 给定一个5x5的方格,共25盏灯
  • 每盏灯有开和关两种状态
  • 每次操作一盏灯时,以该灯为中心的十字形状范围的灯都会改变状态
  • 找到用最少的操作步数使所有的灯都亮着,当步数超过6时返回-1
思路1:
  • 暴力枚举出所有整个矩阵所有的操作情况
  • 时间复杂度:225∗25∗5∗5002^{25}*25*5*500225∗25∗5∗500 远大于 1e,不可行
思路2:
  • 枚举出对第一行的所有操作情况(指数类型枚举模型),注意这里不是枚举第一行的灯的状态
  • 根据推导可知:当第一行操作完毕确认完的状态后,后面除了最后一行的每一行操作就已经确定了,即必须在上一行关灯的下方一个位置进行状态变化
  • 当操作到最后一行到时候,前面的n-1行已经全亮
  • 最后只需要特判一下最后一个行的状态,只要有一个不亮,则说明第一行的本次操作情况无效
  • 时间复杂度:32255*500 远小于 1e,所以可行
import java.util.*;
import java.io.*;
class Main {Scanner s = new Scanner(System.in);// 矩阵数量int n;// 输入的每一行String line;// char数组char[][] g;public void run() {n = s.nextInt();g = new char[5][5];while(n-- > 0) {// 填充数组for (int i = 0; i < 5; i++) {line = s.next();for (int j = 0; j < 5; j++) {g[i][j] = line.charAt(j);}}// 输出每次输入的g的ansminStep(g);}}public void minStep(char[][] c) {// 输入数组的替身char[][] backup = new char[5][5];for (int k = 0; k < 5; k++) {System.arraycopy(c[k], 0, backup[k], 0, 5);}int ans = 7;// 先枚举出第一行的所有操作情况for (int op = 0; op < 32; op++) {// 每次op让step归0int step = 0;// 二进制数中对数字为1的位置进行翻转 for (int i = 0; i < 5; i++) {if ((op >> i & 1) == 1) {turn(backup, 0, i);step++;}}// 从第一行到第四行开始扫描for (int i = 0; i < 4; i++) {for (int j = 0; j < 5; j++) {// 如果当前行的当前列元素为0则对下一行对应位置进行翻转if (backup[i][j] == '0') {turn(backup, i + 1, j); step++;}}}boolean bright = true;// 扫描最后一行元素,判断其是否全为1for (int i = 0; i < 5; i++) {if(backup[4][i] != '1') {bright = false;}}// 如果最后一行全亮,则本次op有效,与前一次的移动步数比较,以至于所有op结束后找到最小值if (bright) {ans = Math.min(ans, step);}// 恢复替身改变之前的状态for (int k = 0; k < 5; k++) {System.arraycopy(c[k], 0, backup[k], 0, 5);}}// 判断最小步数是否大于6,如果大于6则返回-1if(ans > 6) ans = -1;System.out.println(ans);}// 关于(x, y)的5个点偏移量int[] dx = {-1, 0, 1, 0, 0};int[] dy = {0, 1, 0, -1, 0};public void turn(char[][] c, int x, int y) {for (int i = 0; i < 5; i++) {// (a, b)为(x, y)附加对应偏移量的点int a = x + dx[i];int b = y + dy[i];// 判断一下边界,如果越界,这该点无效,不需要翻转if (a < 0 || a >=5 || b < 0 || b >= 5) continue;// 对该点进行翻转c[a][b] = c[a][b] == '1' ? '0' : '1';}}public static  void main(String[] args) {new Main().run();}
}

收获

  • 通过二进制串的位运算进行指数型枚举
  • 二维数组中通过(x, y)的偏移量来遍历(x, y)周围的元素

AcWing 95. 费解的开关(指数型枚举)相关推荐

  1. AcWing 95. 费解的开关 Python详解

    一.算法思想--递推(详细证明见算法竞赛进阶指南原书) 1)若固定第1行,则方案至多只有1种 2)把第1行的所有情况遍历,先把亮着的灯全部关闭 3)遍历前4行,如果灯是关着的,就把下1行同1列的灯改变 ...

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

    文章目录 题目解答 题目来源 题目解答 分析: 枚举第一行,指的是第一行哪些位置要切换状态!!!.第一行总共有5个数,组合数是32,即第一行哪些位置要切换总共有32种情况.这就是我们的枚举空间.比如, ...

  3. AcWing 95. 费解的开关

    原题链接:https://www.acwing.com/problem/content/97/ 看了前几篇题解和y总的视频讲解,总有一个奇怪的点搞不明白,为什么说第一行确定了,第二行就确定了,第三行接 ...

  4. 题解【acwing】95 费解的开关

    题目描述 点击进入题目 你玩过"拉灯"游戏吗?25盏灯排成一个5x5的方形.每一个灯都有一个开关,游戏者可以改变它的状态.每一步,游戏者可以改变某一个灯的状态.游戏者改变一个灯的状 ...

  5. 95. 费解的开关【二级制枚举】

    二进制枚举第一行的操作状态. #include<bits/stdc++.h> using namespace std; const int N=30; char a[N][N],b[N][ ...

  6. Acwing:费解的开关

    题目描述 你玩过"拉灯"游戏吗? 25 盏灯排成一个 5×5 的方形. 每一个灯都有一个开关,游戏者可以改变它的状态. 每一步,游戏者可以改变某一个灯的状态. 游戏者改变一个灯的状 ...

  7. 模版 ----- 一维指数型枚举 排列型枚举 组合型枚举

    文章目录 一维指数型枚举 一.01型枚举 应用场景 递归树模型 时间复杂度 代码模版 应用 二.滑动型枚举 应用场景 递归树模型 时间复杂度 代码模版 排列型枚举 应用场景 递归树模型 时间复杂度分析 ...

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

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

  9. 【结论】【dfs】费解的开关(joyoi-tyvj 1266)

    费解的开关 joyoi-tyvj 1266 题目大意: 有5*5的一个图,每个点的数值是1或0,如果将一个点的数值取反,那这个点上下左右的点都会取反,现在问你将所有点都变为1最少要多少步,如果步数大于 ...

最新文章

  1. R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA)、使用HH包中的interaction2wt函数为任何阶的双因素方差分析可视化主效应和交互作用图、箱图显示主效应
  2. Universal-Image-Loader 示例 工具
  3. 会计记忆总结之三:会计等式与复式记账
  4. 信息系统项目管理师范围管理
  5. 要人帮忙,电脑怎么不寄过来?
  6. 100阶乘c语言如何实现,求10000的阶乘(c语言代码实现)
  7. 技术开发人员需要改变性格吗?
  8. 画面逐渐放大_故宫一幅800年古画,放大55倍,4个老人喝醉了?
  9. HTML5期末大作业:中华美德文化网站设计——中华美德文化(6页) HTML+CSS+JavaScript 中国传统美德文化网页HTML代码
  10. 【学习笔记】python实现excel数据处理
  11. python适合创业吗-python创业
  12. 一文看懂神经网络工作原理
  13. Python文章合集 | (入门到实战、游戏、Turtle、案例等)
  14. arduino数字端口输出电压可驱动多大继电器呢_单片机实例分享,自制数字示波器...
  15. 响铃:跑错了道的VR,如何知途迷返
  16. 使用电脑的时候,发现麦克风不能录音了
  17. 引爆社群:移动互联网时代的新4C法则
  18. AcWing4084 号码牌 (并查集 / bitset优化Floyd)
  19. Hadoop集群搭建之SSH无密码登录配置
  20. “复制”马斯克(二):“一无所有”的世界首富想要什么?

热门文章

  1. C# Cache何时使用及使用方法
  2. C++primer 9.5.5节练习
  3. .NET下为百度文本编辑器UEditor增加图片删除功能
  4. Velocity 语法示例
  5. Sublime Text 2删除行尾空格
  6. 开源.Net邮件服务器-LumiSoft Mail Server简介
  7. 《设计模式详解》行为型模式 - 备忘录模式
  8. 《恋上数据结构第1季》二叉堆实现优先级队列
  9. centos不同版本修改主机名的正确方法
  10. 一行 Python 实现并行化 -- 日常多线程操作的新思路