BFS解开行李箱密码锁
时间:2021-08-06
本文章向大家介绍BFS解开行李箱密码锁,主要包括BFS解开行李箱密码锁使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:有一个带有四个圆形拨轮的转盘锁,每个拨轮都有0-9一共10个数字。每个拨轮可以上下旋转:例如把9变成0,或者0变成9,每次旋转只能将一个拨轮旋转一下。转盘锁的四个拨轮初始都是0,用字符串"0000"表示。现在给定输入一个列表deadends和一个字符串target,其中taeget代表可以打开密码锁的数字,而deadends中包含了一组死亡数字,要避免拨出其中的任何一个密码。请写出一个算法,计算从初始状态"0000"拨出target的最少次数,如果永远无法拨出target,则返回一个-1。
#include <iostream> #include <queue> #include <unordered_set> #include <string> using namespace std; class Solution { public: string plus_one(string str, int index)//str数组里面的第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) { int step = 0; unordered_set<string> deadset(deadends.begin(), deadends.end()); queue<string> lockQueue; lockQueue.push("0000"); unordered_set<string> visited; visited.insert("0000"); while (!lockQueue.empty()) { int sz = lockQueue.size(); for (int i = 0; i < sz; i++) { string node = lockQueue.front(); lockQueue.pop(); if (deadset.find(node) != deadset.end()) continue; if (node.compare(target) == 0)//如果遇到了直接返回步骤数目 return step; for (int j = 0; j < 4; j++) { string up = plus_one(node, j);//向上得到的结果 //如果这个结果不在visited里面就加入,同时放到队列 if (visited.count(up) <= 0) { visited.insert(up); lockQueue.push(up); } string down = down_one(node, j); if (visited.count(down) <= 0) { visited.insert(down); lockQueue.push(down); } } } step++; } return -1; } }; int main() { vector<string> dead = { "0201", "0101", "0102", "1212", "2002" }; string target("0202"); Solution s; int step = s.openLock(dead, target); cout << step << endl; return 0; }
原文地址:https://www.cnblogs.com/logic03/p/15109072.html
- [转载]Go JSON 技巧
- 简单易学的机器学习算法——Rosenblatt感知机的对偶解法
- Spring-拾遗
- Golang面试题
- 简单易学的机器学习算法——基于密度的聚类算法DBSCAN
- 厚土Go学习笔记 | 29. 接口
- Golang Template 简明笔记
- hotspare的copyback(r7笔记第30天)
- Spring-AOP
- DBA和开发同事的一些代沟(三)(r7笔记第29天)
- 简单易学的机器学习算法——非线性支持向量机
- 一条关于swap争用的报警邮件分析(一)(r7笔记第28天)
- Spring-IOC(2)
- Python3 pandas read_csv 读取txt文件报错:IOError: Initializing from file failed
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 11-1 环境中存储的是什么?
- 【Rust日报】2020-08-07 无船同志关于Rust未来Generator语法的新尝试
- 11-2 环境是如何建立的
- 11-3 激活修改
- 12-1 定制提示符
- MySQL INSERT的4种形态
- PowerBI DAX 性能优化 高级视图算法 超越经典 性能提升成千上万倍
- Java开发必备 Git 分支开发:规范指南及完全学会Git的24堂课笔记
- 聊聊dubbo-go的failbackCluster
- 视频综合管理平台EasyNVS通道列表如何获得RTMP地址和RTSP地址?
- 【每周一库】 rust-ftp - an FTP client written in Rust
- Mall 电商实战项目发布重大更新,全面支持SpringBoot 2.3.0 !
- Python与Tableau相结合,万字长文搞定传统线下连锁店数据分析
- 社群答疑精选03:拆分数据到新工作表
- 【Rust日报】2020-08-08:用rust制作的一个Taskwarrior终端用户界面