acwing 116. 飞行员兄弟
地址 https://www.acwing.com/problem/content/118/
“飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱。
已知每个把手可以处于以下两种状态之一:打开或关闭。
只有当所有把手都打开时,冰箱才会打开。
把手可以表示为一个4х4的矩阵,您可以改变任何一个位置[i,j]上把手的状态。
但是,这也会使得第i行和第j列上的所有把手的状态也随着改变。
请你求出打开冰箱所需的切换把手的次数最小值是多少。
输入格式
输入一共包含四行,每行包含四个把手的初始状态。
符号“+”表示把手处于闭合状态,而符号“-”表示把手处于打开状态。
至少一个手柄的初始状态是关闭的。
输出格式
第一行输出一个整数N,表示所需的最小切换把手次数。
接下来N行描述切换顺序,每行输入两个整数,代表被切换状态的把手的行号和列号,数字之间用空格隔开。
数据范围
1≤i,j≤4
输入样例:
-+--
----
----
-+--
输出样例:
6
1 1
1 3
1 4
4 1
4 3
4 4
注意:如果存在多种打开冰箱的方式,则按照优先级整体从上到下,同行从左到右打开。
题解 没有剪枝等捷径 就是考核位运算
使用int change[4][4] 记录任意一个按钮点击后的变化
0~1<<16 二进制代表各种按钮的按法组合 然后遍历尝试
代码如下
#include <iostream>
#include <string>
#include <vector> using namespace std; typedef pair<int,int> PII; int change[][]={}; int get(int x,int y){
return x*+y;
} int main()
{
int state = ;
for(int i = ;i < ;i++){
string tmpStr;
cin >> tmpStr;
for(int j = ; j < tmpStr.size();j++){
if(tmpStr[j] == '+'){
state += <<get(i,j);
}
}
} //制作每次点击某个开关后的变化表格
for(int i =;i < ;i++){
for(int j = ; j < ;j++){
for(int k = ; k < ;k++){
change[i][j] += << get(i,k);
change[i][j] += <<get(k,j);
}
//选择的点回增加两次,减少1
change[i][j] -= << get(i,j);
}
} vector<PII> res;
//遍历各种可能的点击开关的方案 16个按钮选出任意N个点击 从0-16个的排列组合就是0~ 1<<16;
for(int k = ;k < << ;k++){
int now = state;
vector<PII> path;
//当前选择的点击方案 点击了那些按钮
for(int i = ; i< ;i++){
if(k >> i & ){
//该按钮按下了
int x = i/,y = i%;
now ^= change[x][y];
path.push_back({x,y});
}
if(!now && ( res.empty() || res.size() > path.size() ))
res = path;
}
} cout << res.size() << endl;
for(auto p : res)
cout << p.first + << ' ' << p.second+ << endl; return ;
}
acwing 116. 飞行员兄弟的更多相关文章
- (acwing蓝桥杯c++AB组)1.2 递推
1.2 递推与递归 文章目录 1.2 递推与递归 位运算相关知识补充 pair与vector相关知识补充 题目目录与网址链接 下面的讲解主要针对这道题目的题解AcWing 116. 飞行员兄弟 - A ...
- Acwing-116-飞行员兄弟(二进制枚举)
链接: https://www.acwing.com/problem/content/description/118/ 题意: "飞行员兄弟"这个游戏,需要玩家顺利的打开一个拥有1 ...
- LeetCode 5282. 转化为全零矩阵的最少反转次数
地址 https://leetcode-cn.com/submissions/detail/39277402/ 题目描述给你一个 m x n 的二进制矩阵 mat. 每一步,你可以选择一个单元格并将它 ...
- Chapter1 递归与递推
Chapter 1 递归与递推 时间复杂度(转载自yxc大佬) 一般ACM或者笔试题的时间限制是1秒或2秒. 在这种情况下,C++代码中的操作次数控制在 107107 为最佳. 下面给出在不同数据范围 ...
- poj2569
http://poj.org/problem?id=2965 好吧终于没有图片了,这道题看起来应该简单一些吧,毕竟已经有7000多人A了,好吧,还是先看看题目再说. 题目大意: //还是吃过晚饭后再看 ...
- [leetcode] 116. 填充同一层的兄弟节点
116. 填充同一层的兄弟节点 其实就是个二叉树的层次遍历 class Solution { public void connect(TreeLinkNode root) { if (root == ...
- 【LeetCode】116#填充同一层的兄弟节点
题目描述 给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充 ...
- LeetCode 116/117. 填充同一层的兄弟节点(Populating Next Right Pointers in Each Node)
题目描述 给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充 ...
- LeetCode(116):填充同一层的兄弟节点
Medium! 题目描述: 给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *n ...
随机推荐
- redis系列之------主从复制
什么是主从复制 Redis的主从复制机制是指可以让从服务器(slave)能精确复制主服务器(master)的数据,如下图所示: 或者 主从复制的方式和工作原理 工作方式: Redis主从复制主要 ...
- C# 集合汇总
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...
- ES6之Class类
一.Class的基本语法 1.简介 基本上,ES6的class可以看作只是一个 语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让 对象原型 的写法更加清晰.更像面向对象编程的语法而 ...
- js-06-字符串
一.查找字符串的字符串 a:indexOf:没有查询到返回值为-1: b:lastIndexoOf:查找到的为重复的最后一个: c:search 查找: var str="good good ...
- Cesium数据可视化-仓储调度系统可视化部分(附github源码)
Cesium数据可视化-仓储调度系统可视化部分 目的 仓储调度系统需要一个可视化展示物资运输实况的界面,需要配合GPS设备发送的位置信息,实时绘制物资运输情况和仓储仓库.因此,使用Cesium可视化该 ...
- c#串口通信并处理接收的多个参数
最近摸索做个上位机,简单记录一下关键的几个部分 c#做串口通信主要使用的是System.IO.Ports类,其实还是十分方便的 最终效果如下: 千万不要忘记了下面这个 填写串口相关配置 我们可以通过G ...
- LeetCode刷题191218
好多天没有更新了,今天有空,刷一道. 算法第5题 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: ...
- 48-创建 overlay 网络
上一节我们搭建好实验环境,配置并运行了consul,今天开始创建 overlay 网络. 在 host1 中创建 overlay 网络 ov_net1: -d overlay 指定 driver 为 ...
- 12C新功能:在线移动数据文件 (Doc ID 1566797.1)
12C New Feature : Move a Datafile Online (Doc ID 1566797.1) APPLIES TO: Oracle Database - Enterprise ...
- java之Set接口(单列集合)
Set接口概述 java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Coll ...