飞行员兄弟 JAVA题解
“飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱。
已知每个把手可以处于以下两种状态之一:打开或关闭。
只有当所有把手都打开时,冰箱才会打开。
把手可以表示为一个4х4的矩阵,您可以改变任何一个位置[i,j]上把手的状态。
但是,这也会使得第i行和第j列上的所有把手的状态也随着改变。
请你求出打开冰箱所需的切换把手的次数最小值是多少。
输入格式
输入一共包含四行,每行包含四个把手的初始状态。
符号“+”表示把手处于闭合状态,而符号“-”表示把手处于打开状态。
至少一个手柄的初始状态是关闭的。
输出格式
第一行输出一个整数N,表示所需的最小切换把手次数。
接下来N行描述切换顺序,每行输入两个整数,代表被切换状态的把手的行号和列号,数字之间用空格隔开。
注意:如果存在多种打开冰箱的方式,则按照优先级整体从上到下,同行从左到右打开。
数据范围
1≤i,j≤41≤i,j≤4
输入样例:
-+--
----
----
-+--
输出样例:
6
1 1
1 3
1 4
4 1
4 3
4 4
思路:暴力枚举 2 ^16
import java.util.*;
public class Main{static class node{int x,y;node(int x,int y){this.x = x;this.y = y;}}static ArrayList<node> ansL = new ArrayList<>();static int [][]g = new int [6][6];static node[]arr = new node[20];public static void main(String[] args) {Scanner sc = new Scanner(System.in);for(int i = 1;i <= 4;i ++) {String s = sc.next();for(int j = 1;j <= 4;j ++) {if(s.charAt(j-1) == '-') {g[i][j] = 1;}else {g[i][j] = 0;}}}int idx = -1;for(int i = 1;i <= 4;i ++) {for(int j = 1;j <= 4;j ++) {arr[++ idx] = new node(i,j);}}List<node>list = new ArrayList<>();dfs(0,list);System.out.println(ansL.size());for(int i = 0;i < ansL.size();i ++) {int a = ansL.get(i).x;int b = ansL.get(i).y;System.out.println(a + " " + b);}}static void turn(int r,int c) {for(int i = 1;i <= 4;i ++) {g[r][i] ^= 1;g[i][c] ^= 1;}g[r][c] ^= 1;}static boolean is_ok() {for(int i = 1;i <= 4;i ++) {for(int j = 1;j <= 4;j ++) {if(g[i][j] == 0) {return false;}}}return true;}static void check(List<node>list) {int [][]backup = new int [6][6];for(int i = 1;i <= 4;i ++) {for(int j = 1;j <= 4;j ++) {backup[i][j] = g[i][j];}}for(int i = 0;i < list.size();i ++) {int a = list.get(i).x;int b = list.get(i).y;turn(a,b);}if(is_ok()) {ansL = new ArrayList<>(list);}for(int i = 1;i <= 4;i ++) {for(int j = 1;j <= 4;j ++) {g[i][j] = backup[i][j];}}}static void dfs(int idx,List<node>list) {if(idx == 16) {check(list);return;}dfs(idx+1,list);list.add(arr[idx]);dfs(idx+1,list);list.remove(list.size()-1);}
}
飞行员兄弟 JAVA题解相关推荐
- 116. 飞行员兄弟 Java题解
注意:如果存在多种打开冰箱的方式,则按照优先级整体从上到下,同行从左到右打开. 数据范围 1≤i,j≤4 输入样例: -+-- ---- ---- -+-- 输出样例: 6 1 1 1 3 1 4 4 ...
- 飞行员兄弟 Java版
"飞行员兄弟"这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱. 已知每个把手可以处于以下两种状态之一:打开或关闭.只有当所有把手都打开时,冰箱才会打开.把手可以表示为一个4х ...
- Java实现十字形开关问题(“飞行员兄弟“)
主要通过位运算 "飞行员兄弟"这个游戏,需要玩家顺利的打开一个拥有 16 个把手的冰箱. 已知每个把手可以处于以下两种状态之一:打开或关闭. 只有当所有把手都打开时,冰箱才会打开. ...
- AcWing 116. 飞行员兄弟(二维指数型枚举)
116. 飞行员兄弟 思路: 通过二进制串暴力枚举所有操作情况 从左上到右下扫描二进制串 (当一个答案存在多种操作情况时保证优先级整体从上到下,同行从左到右打开) 把每次的操作坐标存放到ArrayLi ...
- Acwing---116.飞行员兄弟
飞行员兄弟 1.题目 2.基本思想 3.代码实现 1.题目 "飞行员兄弟"这个游戏,需要玩家顺利的打开一个拥有 16 个把手的冰箱. 已知每个把手可以处于以下两种状态之一:打开或关 ...
- java变量中不属于复合类型的数据类型是_2006新版JAVA题解(JAVA简单数据类型)...
2006新版JAVA题解(JAVA简单数据类型) 2007年1月22日来源:233网校网校课程 在线题库评论 分享到 1.下列哪一个是合法的标识符: A.12class; B.+viod; C.-5; ...
- 2020第五届上海第二工业大学新生程序设计竞赛(Java题解)
2020第五届上海第二工业大学新生程序设计竞赛(Java题解) 作为C/C++版本的补充题解,仅供参考 需要解析的可以看这篇: 2020第五届上海第二工业大学新生程序设计竞赛 用Java语言参加竞赛时 ...
- 笔试编程题 拼凑正方形 Java题解 牛牛有4根木棍,长度分别为a,b,c,d。羊羊家提供改变木棍长度的服务,如果牛牛支付一个硬币就可以让一根木棍的长度加一或者减一。牛牛需要用这四根木棍拼凑一个正方
题目描述 牛牛有4根木棍,长度分别为a,b,c,d.羊羊家提供改变木棍长度的服务,如果牛牛支付一个硬币就可以让一根木棍的长度加一或者减一.牛牛需要用这四根木棍拼凑一个正方形出来,牛牛最少需要支付多少硬 ...
- p3371 单源最短路径(弱化版)-java题解-最短路
弱化版传送门: P3371 [模板]单源最短路径(弱化版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通 ...
最新文章
- 一个对称性解释三个宇宙学难题;引力波碰撞会发光?粘液霉菌助力寻找宇宙网 | 一周科技速览...
- appium+tidevice实现iOS自动化测试(Mac)
- 体系化认识RPC--转
- 分享:Android程序员,必备精品网站大汇总
- 奇安信cdn配置教程_PicGo+jsDelivr+GitHub搭建免费cdn加速的图床
- 大数据常见组件的访问页面总结
- python 多继承的问题
- Java进阶07 嵌套类
- GUI Design Studio 4 5 151 0原型设计工具的使用
- 统计表达式二叉树操作数个数
- XXE漏洞 解决方案(JAVA版本)
- 阿里巴巴java方向笔试题 带详细答案
- Word 2019 插入参考文献
- mac bookpro m1 笔记本关闭键盘屏幕 禁用键盘屏幕使用 键盘屏幕误触 Touch Bar禁用 禁用MacBook-Pro的触摸栏
- 计算机只报数字怎么调成音乐,电脑怎么设置一锁屏音乐就停?
- c语言打包游戏补丁,C语言实现的系统补丁自动安装工具.doc
- EventBus实现原理
- 安全刻不容缓「GitHub 热点速览 v.21.50」
- 24.多线程(等待唤醒机制,volatile,CAS 算法,线程池,定时器,设计模式)
- linux+nas+私有云软件,自建家庭私有云NAS——磁盘管理系统