注意:如果存在多种打开冰箱的方式,则按照优先级整体从上到下,同行从左到右打开。

数据范围

1≤i,j≤4

输入样例:

-+--
----
----
-+--

输出样例:

6
1 1
1 3
1 4
4 1
4 3
4 4

解题思路:

先将4*4的16个格子中所有可能出现的情况枚举一次,接着按照枚举的方案对灯泡进行操作,最后判断是否满足条件。

Java代码:

import java.io.*;public class Main {static char [][]s = new char[4][4];static char [][]temp = new char[4][4];static StringBuilder ansStep = new StringBuilder();static StringBuilder res = new StringBuilder();public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));for(int i = 0; i < 4; i++) {String str = br.readLine();for(int j = 0; j < 4; j++) {s[i][j] = str.charAt(j);}}int ans = Integer.MAX_VALUE;for(int op = 0; op < 1 << 16; op++) {//比用四个for清晰for(int i = 0; i < 4; i++) {//在备份数组上操作for(int j = 0; j < 4; j++) {temp[i][j] =  s[i][j];}}int step = 0;res = new StringBuilder();for(int i = 0; i < 4; i++) {//两个for是为了得出数组整体的相对位置posfor(int j = 0; j < 4; j++) {int pos = i * 4 + j;//将二维坐标一维化的编号if((op >> pos & 1) == 1) {step++;turn_all(i, j);res.append((i + 1) + " " + (j + 1) + "\n");}}}boolean flag = true;//检查for(int i = 0; i < 4; i++) {for(int j = 0; j < 4; j++) {if(temp[i][j] == '+')flag = false;}}if(flag) {if(ans > step) {ans = step;ansStep = res;}}}System.out.println(ans);System.out.print(ansStep);}public static void turn_all(int x, int y) {for(int i = 0; i < 4; i++) {turn_one(x, i);turn_one(i, y);}turn_one(x, y);//多算了一次}public static void turn_one(int x, int y) {if(temp[x][y] == '+') {temp[x][y] = '-';}else {temp[x][y] = '+';}}
}

116. 飞行员兄弟 Java题解相关推荐

  1. 飞行员兄弟 JAVA题解

    "飞行员兄弟"这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱. 已知每个把手可以处于以下两种状态之一:打开或关闭. 只有当所有把手都打开时,冰箱才会打开. 把手可以表示为一个 ...

  2. AcWing 116. 飞行员兄弟(二维指数型枚举)

    116. 飞行员兄弟 思路: 通过二进制串暴力枚举所有操作情况 从左上到右下扫描二进制串 (当一个答案存在多种操作情况时保证优先级整体从上到下,同行从左到右打开) 把每次的操作坐标存放到ArrayLi ...

  3. 飞行员兄弟 Java版

    "飞行员兄弟"这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱. 已知每个把手可以处于以下两种状态之一:打开或关闭.只有当所有把手都打开时,冰箱才会打开.把手可以表示为一个4х ...

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

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

  5. Java实现十字形开关问题(“飞行员兄弟“)

    主要通过位运算 "飞行员兄弟"这个游戏,需要玩家顺利的打开一个拥有 16 个把手的冰箱. 已知每个把手可以处于以下两种状态之一:打开或关闭. 只有当所有把手都打开时,冰箱才会打开. ...

  6. Acwing---116.飞行员兄弟

    飞行员兄弟 1.题目 2.基本思想 3.代码实现 1.题目 "飞行员兄弟"这个游戏,需要玩家顺利的打开一个拥有 16 个把手的冰箱. 已知每个把手可以处于以下两种状态之一:打开或关 ...

  7. java变量中不属于复合类型的数据类型是_2006新版JAVA题解(JAVA简单数据类型)...

    2006新版JAVA题解(JAVA简单数据类型) 2007年1月22日来源:233网校网校课程 在线题库评论 分享到 1.下列哪一个是合法的标识符: A.12class; B.+viod; C.-5; ...

  8. 2020第五届上海第二工业大学新生程序设计竞赛(Java题解)

    2020第五届上海第二工业大学新生程序设计竞赛(Java题解) 作为C/C++版本的补充题解,仅供参考 需要解析的可以看这篇: 2020第五届上海第二工业大学新生程序设计竞赛 用Java语言参加竞赛时 ...

  9. 笔试编程题 拼凑正方形 Java题解 牛牛有4根木棍,长度分别为a,b,c,d。羊羊家提供改变木棍长度的服务,如果牛牛支付一个硬币就可以让一根木棍的长度加一或者减一。牛牛需要用这四根木棍拼凑一个正方

    题目描述 牛牛有4根木棍,长度分别为a,b,c,d.羊羊家提供改变木棍长度的服务,如果牛牛支付一个硬币就可以让一根木棍的长度加一或者减一.牛牛需要用这四根木棍拼凑一个正方形出来,牛牛最少需要支付多少硬 ...

最新文章

  1. Python部署与安装
  2. 国际化组件 Unicode (ICU) 函数库
  3. 怎么看so文件是哪个aar引进来的_手机爱奇艺下载视频存在哪个文件夹
  4. 安卓开发学习笔记(六):如何实现指定图片定时开屏功能?
  5. 使用数据模板自定义数据显示
  6. 《Getting Started with WebRTC》第二章 WebRTC技术介绍
  7. 三进制计算机_要做一个编程界优秀的攀登者,首先要认真计算机中的0和1
  8. 内容管理项目小结 成功案例-公司官网,游戏官网
  9. raspberrypi 与 arduino 使用 nRF24L01+ 通信 -- arduino为接收端
  10. java实现QQ登录
  11. 大数据小项目之电视收视率企业项目03
  12. 笔记本电脑下面的任务栏一直转圈圈
  13. python+编译器 下载、安装
  14. 北航计算机学院复试专业课科目,2018北航自招复试经历总结
  15. php漂浮,【飘】【漂】:【飘浮】【漂浮】、【漂泊】【飘泊】【飘薄】
  16. Exemplar Fine-Tuning for 3D Human Model Fitting Towards In-the-Wild 3D Human Pose Estimation 2020阅读理
  17. 我的星座图 php,星座图映射
  18. SQL中日期函数的运用
  19. 做一个展示型企业网站要多少钱
  20. 好的idea配色方案

热门文章

  1. Linux 安装docker教程
  2. 10亿数据找出前100大的数据(网易大数据面试算法题)
  3. 系统如何自动识别短信验证码
  4. sqlDbx连接oracle64位
  5. 解决VS中的 无法启动程序,系统找不到指定文件 问题
  6. 【我的Android进阶之旅】繁体字的标点符号应该是居中还是在左下角?
  7. redux与react-redux的区别:
  8. 数据库在网站中的作用
  9. FIP: A fast overlapping community-based influence maximization algorithm using probability coefficie
  10. 深度学习基础知识(人工智能)