主要通过位运算
“飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有 16 个把手的冰箱。

已知每个把手可以处于以下两种状态之一:打开或关闭。

只有当所有把手都打开时,冰箱才会打开。

把手可以表示为一个 4×4 的矩阵,您可以改变任何一个位置 [i,j] 上把手的状态。

但是,这也会使得第 i 行和第 j 列上的所有把手的状态也随着改变。

请你求出打开冰箱所需的切换把手的次数最小值是多少

import java.util.*;
import java.lang.*;
public class Main{static char[][] st = new char[5][5];static char[][] back = new char[5][5];public static void main(String[] args){Scanner in = new Scanner(System.in);for(int i=0;i<4;i++){st[i] = in.next().toCharArray();back[i] = st[i];  //进行备份}int step = 999;String strX = "",strY = ""; //存储路径for(int op=0;op< (1<<16) ;op++){ //共进行2的16次操作int res = 0;String strX1 = "",strY1="";for(int i=0;i<16;i++){ //根据二进制进行翻转if((op>>i & 1)==1){int x = i/4;int y = i%4;strX1+=x;strY1+=y;turnAll(x,y); // 进行翻转res++;}}boolean flag = true;for(int i=0;i<4;i++){  //进行检验for(int j=0;j<4;j++){if(st[i][j]=='+'){flag = false;break;}}}if(flag==true){if(step>res){step=res;}strX = strX1;strY = strY1;}res=0;strX1="";strY1="";for(int i=0;i<4;i++){st[i]=back[i].clone(); //每次操作完进行恢复}}System.out.println(step);for(int i=0;i<strX.length();i++){int a = strX.charAt(i)-47;int b = strY.charAt(i)-47;System.out.println(a+" "+b);}}public static void turnAll(int i,int j){for(int m=0;m<4;m++){turnOne(i,m);}for(int m=0;m<4;m++){turnOne(m,j);}turnOne(i,j);}public static void turnOne(int i,int j){if(st[i][j]=='+'){st[i][j]='-';}else{st[i][j]='+';}}
}

Java实现十字形开关问题(“飞行员兄弟“)相关推荐

  1. 飞行员兄弟 Java版

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

  2. 飞行员兄弟 JAVA题解

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

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

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

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

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

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

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

  6. java培训:Java的十大算法

    想要学好java语言,就要打好基础,java要学习的东西有很多,今天小编就来和大家说下java的十大算法. 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个 ...

  7. 学习Java的十大理由,益处太多了

    Java应该是软件开发同学最熟悉的一种开发语言,古老但很流行,再加上现在大数据发展形势一片大好,更让Java的魅力十足.Java是任何人都会掌握的最基本的编程语言之一,因此简单.然而,使用Java开发 ...

  8. JAVA中用于处理字符串的 三兄弟

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! JAVA ...

  9. Java体系十大组织

    Sun : 因为Java而永被荣光 Sun是1980年代初期由斯坦福大学三位年轻学生创立的公司.与一般人的印象不同,"SUN"的本意并不是企图剽窃天上那颗温暖的恒星的威名,而是&q ...

最新文章

  1. Making Your Own iPhone Frameworks. In Xcode
  2. easyui 隐藏和显示datagrid
  3. 实现 ASP.NET 网站地图提供者
  4. 深度学习(32)随机梯度下降十: 手写数字识别问题(层)
  5. 小写数字转大写_不得不说的Excel小技巧:设置单元格格式将小写金额转换成大写...
  6. git 开发功能分支标准流程
  7. python 浮点数比较_Python中的浮点数
  8. 重写重载与重定义的区别
  9. python爬虫爬取圆通快递信息
  10. web中html+CSS修改背景图片的不透明度
  11. optim优化器的使用
  12. 网络流(Network Flow)
  13. foxmail群发邮件怎么发?
  14. 印度程序员和中国程序员的区别
  15. 【2021】【论文笔记】红外及THz下的细胞膜生物效应——效应是现象,作用是机理——THz对医学的好处
  16. hive中的distribute by、sort by、cluster by
  17. 六款自适应引导页HTML源码
  18. 一种可以成功重复夹层中水的静态介电常数的结构
  19. 【打印机】斑马打印机指令简介
  20. python 模拟按照指定概率进行抽样

热门文章

  1. the work directory /tmp/ oracle,Oracle升级问题总结
  2. java面试常问问题及答案,附源代码
  3. 高级计算机培训 英语教案设计,第四课时英语教案设计
  4. 怎么改变html无序列表的字号,html无序列表代码 html5 无序列表的行距怎么设置
  5. Android Accessibility(辅助功能) 学习
  6. 用C语言对单词首字母进行排序,c语言单词排序
  7. IIS服务器管理资源的几个方法和工具
  8. jQuery是什么?和它的优缺点
  9. AKAZE/KAZE局部特征
  10. 百度网盘文件下载工具