116. 飞行员兄弟

思路:

  • 通过二进制串暴力枚举所有操作情况
  • 从左上到右下扫描二进制串 (当一个答案存在多种操作情况时保证优先级整体从上到下,同行从左到右打开)
  • 把每次的操作坐标存放到ArrayList<int[]> temp
  • 特判一下每次操作结束后的结果是否符合题意
  • 如果符合题意则用temp先初始化size=0的ans,如果后面存在比ans的size更小的操作情况则更新ans
  • 时间复杂度:216∗(16∗7+16)2^{16}*(16*7+16)216∗(16∗7+16)
import java.util.*;
import java.io.*;public class Main {Scanner s = new Scanner(System.in);BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));// 记录输入的矩阵char[][] g;// 记录每次操作的坐标ArrayList<int[]> list;// 记录输入的矩阵每一行String line;public void run() throws Exception {list = new ArrayList<>();g = new char[4][4];// 输入矩阵for (int i = 0; i < 4; i++) {line = s.next();for (int j = 0; j < 4; j++) {g[i][j] = line.charAt(j);}}// 打印最小步数与每一步的操作坐标minStep(g);log.flush();}public void minStep(char[][] c) throws Exception {char[][] backup = new char[4][4];for (int i = 0; i < 4; i++)System.arraycopy(c[i], 0, backup[i], 0, 4);// 保存最终的答案对应的操作坐标ArrayList<int[]> ans = new ArrayList<>();// 枚举二维二进制串for (int op = 0; op < 1 << 16; op++) {// 扫描二维二进制串,对二进制串中标记为1的数字对应的位置进行操作,并记录一下操作的坐标for (int i = 0; i < 4; i++)for (int j = 0; j < 4; j++) {if ((op >> get(i, j) & 1) == 1) {turn(backup, i, j);list.add(new int[]{i + 1, j + 1});}}boolean openAll = true;// 扫描一下操作后的矩阵,判断其是否已经全打开for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (backup[i][j] == '+') {openAll = false;break;}}}// 如果已经全打开if (openAll) {// 判断一下操作次数,更新ansif (ans.isEmpty() || ans.size() > list.size()) listCopy(ans, list);}// 复原for (int i = 0; i < 4; i++)System.arraycopy(c[i], 0, backup[i], 0, 4);list.clear();}log.write(ans.size() + "\n");for (int i = 0; i < ans.size(); i++) {log.write(ans.get(i)[0] + " " + ans.get(i)[1] + "\n");}}private void listCopy(ArrayList<int[]> desc, ArrayList<int[]> src) {desc.clear();desc.addAll(src);}// 二维二进制串中(x, y)坐标对应的二进制串中的索引public int get(int x, int y) {return x * 4 + y;}public void turn(char[][] c, int x, int y) {// 竖着扫描for (int i = 0; i < 4; i++) {c[i][y] = c[i][y] == '+' ? '-' : '+';}// 横着扫描for (int j = 0; j < 4; j++) {c[x][j] = c[x][j] == '+' ? '-' : '+';}c[x][y] = c[x][y] == '+' ? '-' : '+';}public static void main(String[] args) throws Exception {new Main().run();}
}

AcWing 116. 飞行员兄弟(二维指数型枚举)相关推荐

  1. 小技巧 ----- 通过二进制串的位运算进行二维指数型枚举

    二维指数型枚举 题目: 给定4x4矩阵(每个元素为1或0) 枚举出所有情况,在矩阵元素为1的位置执行turn()方法 思路: 把4x4方格看作一个一维的水平长度为16的方格 即现在需要枚举一个长度为1 ...

  2. AcWing 95. 费解的开关(指数型枚举)

    95. 费解的开关 题意: 给定一个5x5的方格,共25盏灯 每盏灯有开和关两种状态 每次操作一盏灯时,以该灯为中心的十字形状范围的灯都会改变状态 找到用最少的操作步数使所有的灯都亮着,当步数超过6时 ...

  3. AcWing 99. 激光炸弹 (二维前缀和)

    99. 激光炸弹 题意 给定一个5000x5000的地图 随机在该地图上放置物品,物品具有价值,且不同物品可以放置在同一位置 有一个炸弹的爆炸范围为RxR的正方形 问该炸弹在地图上爆炸一次,最多能摧毁 ...

  4. 116. 飞行员兄弟 Java题解

    注意:如果存在多种打开冰箱的方式,则按照优先级整体从上到下,同行从左到右打开. 数据范围 1≤i,j≤4 输入样例: -+-- ---- ---- -+-- 输出样例: 6 1 1 1 3 1 4 4 ...

  5. AcWing 1020. 潜水员(二维费用背包)

    一.问题 二.思路 这道题其实很容易看出是一个二维费用背包的变形,如果我们将氧气看作体积,将氮气看作价值的话,这道题就变成了从 i i i个物品里面选,体积至少为 m m m,价值至少为 n n n的 ...

  6. 116. 飞行员兄弟【二进制枚举】

    二进制枚举即可,需要注意的是,这道题和费解的开关还是有不同点的. 费解的开关枚举第一行就行了,因为它有依赖关系的. 而这个是一个十字形,无那种关系.故直接暴力枚举邓按不按的所有情况即可. #inclu ...

  7. AcWing 4801 选数(二维费用背包的建立)

    AcWing 4180.选数字 问题描述: 给定 n 个整数 a1,a2,-,ana_1,a_2,-,a_na1​,a2​,-,an​. 请你从中选取恰好 k 个数,要求选出的数的乘积的末尾 0 的数 ...

  8. C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码

    本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...

  9. AcWing之二维数组的查找

    题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 样例 输入数组: [ [ ...

最新文章

  1. 如何理解矩阵的特征向量和特征值?
  2. NSMutableArray 如果只进行了声明,而没有进行初始化,那么程序不会报错,但是,声明的那个变量不起任何作用...
  3. 赠书:深入理解MySQL主从原理
  4. 远程桌面与本地桌面实现文件传输
  5. c语言初学者百题大战答案七,C语言百题大战2405how many minutes
  6. html实现旅游网站代码_[资源推荐] 必须收藏的两个查找论文和代码实现的网站!...
  7. Layer 父子页面之间的交互
  8. 后台导出大量数据超时报 nginx404错误
  9. 坚果云 operationnotallowed webdav_妙用 NAS 服务,将你的知识库和音乐库搬上「云」...
  10. 【题解】牛客小白月赛16(部分题,待补充……)
  11. asp.net mvc3 利用Ajax实现局部刷新
  12. telnet后为啥打开的时防火墙_以前用散煤取暖时,农民很大方,换上天然气后就“蔫了”,为啥?...
  13. 字符编码原理 ASCII,Unicode和UTF-8 - - ITeye技术网站
  14. appium+python自动化51-adb文件导入和导出(pull push)
  15. Excel 制作甘特图(多图)
  16. 面对换领导或空降管理者,该怎么办?
  17. Chrome 扩展 Pomodoro 开发小结
  18. m4s格式转换mp3_超级详细!如何将B站缓存m4s文件无损转换为mp4格式
  19. 别人家的报纸页数和自己的页数
  20. java web网站 js 简体繁体切换_通过JS实现网站繁体简体互换

热门文章

  1. 落花美眷,终究抵不过逝水流连,回忆我的2016,展望2017。
  2. 利用gp自己做的生成缓冲区的代码
  3. [Android]Eclipse连不上模拟器的问题[emulator-5554 disconnected](转)
  4. 【SpringMVC笔记】Ajax 入门(jQuery.ajax)
  5. 记事本之修改非txt文档
  6. shell条件检查原理:command echo ‘success‘ || echo ‘error‘
  7. 南昌大学利用计算机作弊怎样处分,关于江西南昌大学医学院计算机中心教师组织全国计算机二级考试集体作弊的意见书...
  8. 玩转大数据可视化,推荐几个必学的工具
  9. 1核1g java_wordpress博客1核1G1M够用吗
  10. doctor mysql数据导入_线上环境mysql主从同步的搭建过程