打开转盘锁
打开
2023-09-14 08:56:53 时间
![](https://img2022.cnblogs.com/blog/1468919/202207/1468919-20220711144248922-389426367.png)
https://leetcode.cn/problems/open-the-lock/solution/shou-hua-tu-jie-tu-bfs-lin-jie-guan-xi-7-ud8c/
func openLock(deadends []string, target string) int { step := 0 // 旋转次数 deadendsMap := make(map[string]bool) visitedMap := make(map[string]bool) for _, v := range deadends { // 记录所有“死亡点” deadendsMap[v] = true } q := []string{"0000"} // 队列q for len(q) > 0 { // 循环直至队列为空 size := len(q) // 获取BFS当前level的节点个数 for i := 0; i < size; i++ { // 遍历当前层的节点 node := q[0] // 获取出列的节点 q = q[1:] // 节点出列 if node == target { // 如果出列的节点正好是目标节点 return step // 返回当前所用的步数 } if _, ok := visitedMap[node]; ok { // 之前访问过该节点,跳过 continue } if _, ok := deadendsMap[node]; ok { // 遇到“死亡点”,跳过 continue } visitedMap[node] = true // 将该点标记为访问过 for j := 0; j < len(node); j++ { // 通过遍历当前字符串,找出它的所有子节点,安排入列 num := int(node[j] - '0') // 获取当前的数字num up := (num + 1) % 10 // 往上拧所得的新数,比如1变成2 down := (num + 9) % 10 // 往下拧所得的新数,比如7变成6 q = append(q, node[:j]+strconv.Itoa(up)+node[j+1:]) // 拼成新字符串,入列 q = append(q, node[:j]+strconv.Itoa(down)+node[j+1:]) // 拼成新字符串 入列 } } step++ // 当前层的所有节点遍历完毕,层次+1 } return -1 // 无论如何都遇不到目标节点,返回-1 }
相关文章
- 怎么用浏览器在线打开pdf文件_PDF文件怎么编辑
- 解决Myeclipse打开后遇到 SECURITY ALERT: INTEGRITY CHECK ERROR
- 【错误记录】Android WebView 报错 ( 网页无法打开 位于 http://... 的网页无法加载, 因为 net::ERR_CLEARTEXT_NOT_PERMITTED )
- python通过wxPython打开并播放wav文件详解编程语言
- MySQL自动退出:问题分析与解决方案(mysql打开后就关闭了)
- Linux下快速打开浏览器的命令(linux打开浏览器命令)
- 数据库系统SqlServer:为你打开大数据之门(SqlServer是大型)
- 利用JS自动打开页面上链接的实现代码
- win8下XAMPP中Apache模块无效(apache无法打开)的解决方法