//本程序是对照leetcode 找到岛屿而写的
//加入队列回查功能,将各个节点都进行保留
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<queue>
#include <unordered_set>
using namespace std;class Solution {public:string plus_one(string str, int index){if (str[index] == '9')str[index] = '0';else{str[index] = str[index] + 1;}return str;}string down_one(string str, int index){if (str[index] == '0')str[index] = '9';else{str[index] = str[index] - 1;}return str;}int openLock(vector<string>& deadends, string target) {unordered_set<string> deadset(deadends.begin(), deadends.end());const string finnal_target(target);queue<string>q;vector<queue<string>> que_Pre ;//上次的队列容器vector<queue<string>> que_Now;//这次经过扩增之后的队列容器q.push("0000");que_Now.push_back(q);unordered_set<string>visited;visited.insert("0000");int step = 0;while (!q.empty()){que_Pre = que_Now;   //将上一次结果进行转存que_Now.clear();  //将当前的路径进行清除操作int queue_size = q.size();for (size_t i = 0; i < queue_size; i++){string str_cnw = q.front();q.pop();if (deadset.find(str_cnw) != deadset.end()){//找到了不能经过的死路,那么就continue大循环continue;}if (str_cnw.compare(finnal_target) == 0){for (size_t i = 0; i < que_Pre.size(); i++){if (que_Pre[i].back().compare(finnal_target) == 0){this_road = que_Pre[i];}}return step;}for (size_t i = 0; i < 4; i++){string str_up = plus_one(str_cnw, i);int count_num = visited.count(str_up);if (visited.count(str_up) <= 0){for (size_t i = 0; i < que_Pre.size(); i++){if (que_Pre[i].back().compare(str_cnw)==0){queue<string> que_tempUp = que_Pre[i];que_tempUp.push(str_up);que_Now.push_back(que_tempUp);}}visited.insert(str_up);q.push(str_up);}string str_down = down_one(str_cnw, i);if (visited.count(str_down) <= 0){for (size_t i = 0; i < que_Pre.size(); i++){if (que_Pre[i].back().compare(str_cnw)==0){queue<string> que_tempDown = que_Pre[i];que_tempDown.push(str_down);que_Now.push_back(que_tempDown);}}visited.insert(str_down);q.push(str_down);}}}step++;//在哪里进行加入步数的计数比较关键}return -1;}queue<string> this_road;};int main() {vector<string> str_in = { "0201","0101","0102","1212","2002" };string str_target("0202");Solution s;int step = s.openLock(str_in, str_target);cout << step << endl;cout << "解锁步骤" << endl;while (!s.this_road.empty()){cout << s.this_road.front() << "->";s.this_road.pop();}cout << endl;system("pause");return 0;
}

本程序进行了改进,加入了关于每一个步的路径进行输出:

并没有进行优化,问题还是有的,记录路径的程序有冗余

如果步数更多的话,那么就会非常的冗余,影响运算速度。先提出优化思路-》比如经过一段时间将一些和目标太远的queue从容器里删除,进行优化。希望大家交流。

【C++学习笔记】密码转盘锁解题,记录开锁步骤相关推荐

  1. [视觉SLAM十四讲]学习笔记2-关于欧拉角和万向锁

    [视觉SLAM十四讲]学习笔记2-关于欧拉角和万向锁 1 欧拉角 1.1 维基百科定义 1.2 ZYX欧拉角与rpy角 2 万向锁 2.1 万向节 2.1 万向锁的产生 1 欧拉角 1.1 维基百科定 ...

  2. USB学习笔记(5)STM32 USB库移植步骤

    USB学习笔记(5)STM32 USB库移植步骤 本文是将官网的USB驱动库文件移植到自己的工程里面,实现USB功能的具体移植步骤说明,实现Custom_HID功能. 1.先准备一个工程模板 获取工程 ...

  3. c51单片机开发-可以测距开锁和远程开锁

    本项目是以STC89C52单片机为基础,利用ESP8266模块和超声波模块实现可以测距开锁和远程控制开锁.此时我们可以借助网络调试小助手来实现一个模拟的服务器,而此时ESP8266模块作为我们的客户端 ...

  4. 学习笔记:Java 并发编程④_无锁

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  5. 树莓派学习笔记——Python SQLite插入温度记录

    0 前言 本文使用python向SQLite数据库中插入树莓派温度数据,SQLite数据库中包含一张只包含三个字段的记录表--参数名称,时间和温度值.本文重点解释Python操作SQlite的具体方法 ...

  6. 学习笔记之车道线相关记录

    一. 车道线相关的知识 &&1.标线的分类 以下分类来自于百科: 按照道路交通标线的功能划分为:指示标线.警告标线和禁止标线. 按标划方法可分为:白色虚线.白色实线.黄色虚线.黄色实线 ...

  7. mysql如何实现读提交锁_MySQL学习笔记(二)—MySQL事务及锁详解

    一.事务 数组库的一组操作,要么全部成功,要么全部失败 举例:银行转账 A账户向B账户转100 A账户余额扣去100 B账户余额增加100 上述两个操作要么全部成功,要么全部失败,部分成功或失败,数据 ...

  8. STM32智能门禁连接阿里云(指纹开锁、密码开锁、刷卡开锁、手机开锁)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 本文主要介绍如何使用STM32连接阿里云,如何通过各种输入设备(四种开锁方式)设置门禁打开方式,并且介绍阿里云上部的详 ...

  9. c语言线程锁的原理开锁原理图,C++多线程之可重入锁

    #include #include #include using namespace std; recursive_mutex re; void task1() { re.lock(); cout & ...

  10. php连接硬件开锁,织梦开锁换锁网站php源码 dede大气机械设施网站织梦CMS梦模

    ★模板详情★ 织梦开锁换锁网站php源码 dede大气机械设施网站织梦CMS梦模,测试完整无错,兼容主流浏览器. 模板包含安装文档,并包含测试数据. [后端程序]搭载dedecms5.7内核 [运行环 ...

最新文章

  1. 8月最新阿里技术栈架构资料
  2. 框架源码系列四:手写Spring-配置(为什么要提供配置的方法、选择什么样的配置方式、配置方式的工作过程是怎样的、分步骤一个一个的去分析和设计)...
  3. Objective-C中MRC和ARC的自我理解
  4. 开发人员如何了解用户和需求
  5. 协程:Greenlet模块、Gevent模块
  6. hadoop-1.1.2 在centos环境下的部署
  7. if-else运用及技巧(C# 参考)
  8. HashMap和HashSet的内部工作机制
  9. 系统无法分配所需内存_Innodb内存管理解析
  10. 军事医学研究院应晓敏组招聘博士后
  11. 解锁树莓派root账号
  12. Linux内存管理:memblock
  13. PayPal网站付款标准版(for PHP)
  14. 推荐系统回顾,FFM引入特征域进一步增强了模型的表达能力。大规模分段线性模型LS-PLM
  15. MySQL中MGR中SECONDARY节点磁盘满,导致mysqld进程被OOM Killed
  16. 汇编语言程序设计---期末复习大纲知识点总结(王爽第二版)
  17. CCA分析图如何解读_微生物群落与环境因子关联:全自动的CCA/RDA分析流程!!...
  18. 自作孽!知网终于被查了,涉嫌垄断,背后到底是何方神圣?
  19. 各种编码中使用到的工具类
  20. 软件体系结构描述语言与建模实验描述c2软件体系结构风格,软件体系结构描述语言.pdf...

热门文章

  1. signapk.java_安卓签名工具(signapk)
  2. 2019中国互联网应用基本发展状况
  3. asp毕业设计—— 基于asp+access的网上购物系统设计与实现(毕业论文+程序源码)——网上购物系统
  4. 零基础CSS入门教程(29)–CSS下拉菜单实例
  5. 涨姿势!一文了解深度学习中的注意力机制
  6. SOLIDWORKS工程图教程:SOLIDWORKS2019工程图新增功能
  7. 英语音标音节与自然拼读总结
  8. kindle android 音标 乱码,在乐视2手机上解决kindle阅读器即译时音标显示正常的问题...
  9. python垃圾邮件识别_手把手教你用 python 和 scikit-learn 实现垃圾邮件过滤
  10. Vue报错信息Module not found: Error: Can‘t resolve ‘vue/types/umd‘ in