牛客NC363 开锁【中等 BFS Java/Go/PHP】

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/e7cbabbf7e0a41ec98055ee5f3d33bbe
https://www.lintcode.com/problem/796

思路

在这里插入图片描述

Java代码

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param vec string字符串ArrayList* @param tar string字符串* @return int整型*/public int open (ArrayList<String> vec, String tar) {//BFS  注意 当前状态,能得到到的下一个状态列表如何得到//比如0000的可以变化的下一个状态: 共4位,每一位取上一个值,下一个值// [9000, 1000, 0900, 0100, 0090, 0010, 0009, 0001]if ("0000".equals(tar)) return 0;Set<String> locked = new HashSet<>();for (String d : vec) {locked.add(d);if ("0000".equals(d)) return -1; //初始就被锁住了}Queue<String> q = new LinkedList<>();q.add("0000");Set<String> visited = new HashSet<>();visited.add("0000");int step = 0;while (!q.isEmpty()) {step++;int size = q.size();for (int i = 0; i < size; i++) {String status = q.poll();List<String> nexts = getNexts(status);//比如0000的nexts:  [9000, 1000, 0900, 0100, 0090, 0010, 0009, 0001]for (String next : nexts) {if (visited.contains(next) || locked.contains(next)) continue;if (next.equals(tar)) return step;q.add(next);visited.add(next);}}}return -1;}//枚举status通过一次旋转得到的数字public List<String> getNexts(String status) {List<String> ans = new ArrayList<>();char[] arr = status.toCharArray();for (int i = 0; i < 4; i++) {char x = status.charAt(i);//上一个数char prev = x == '0' ? '9' : (char)(x - 1);arr[i] = prev;ans.add(new String(arr));//下一个数char succ = x == '9' ? '0' : (char)(x + 1);arr[i] = succ;ans.add(new String(arr));arr[i] = x;}return ans;}
}

Go代码

package main/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param vec string字符串一维数组* @param tar string字符串* @return int整型*/
func open(vec []string, tar string) int {//BFS  注意 当前状态,能得到到的下一个状态列表如何得到//比如0000的可以变化的下一个状态: 共4位,每一位取上一个值,下一个值// [9000, 1000, 0900, 0100, 0090, 0010, 0009, 0001]if tar == "0000" {return 0}locked := map[string]bool{}for _, d := range vec {locked[d] = trueif d == "0000" {return -1 //初始位置就被锁住了}}q := []string{}visited := map[string]bool{}step := 0q = append(q, "0000")for len(q) > 0 {step++size := len(q)qbak := []string{}for i := 0; i < size; i++ {status := q[i]nexts := getNexts(status)//比如0000的nexts:  [9000, 1000, 0900, 0100, 0090, 0010, 0009, 0001]for _, next := range nexts {if next == tar {return step}_, ok1 := locked[next]_, ok2 := visited[next]if ok1 || ok2 {continue}qbak = append(qbak, next)visited[next] = true}}q = qbak}return -1}// 枚举status通过一次旋转得到的数字
func getNexts(status string) []string {ans := []string{}arr := make([]byte, 4)for i := 0; i < 4; i++ {arr[i] = status[i]}for i := 0; i < 4; i++ {x := arr[i]//上一个var prev byte = '9'if x != '0' {prev = x - 1}arr[i] = prevans = append(ans, string(arr))//下一个var succ byte = '0'if x != '9' {succ = x + 1}arr[i] = succans = append(ans, string(arr))arr[i] = x}return ans
}

PHP代码

<?php/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param vec string字符串一维数组 * @param tar string字符串 * @return int整型*/
function open( $vec ,  $tar )
{//BFS  注意 当前状态,能得到到的下一个状态列表如何得到//比如0000的可以变化的下一个状态: 共4位,每一位取上一个值,下一个值// [9000, 1000, 0900, 0100, 0090, 0010, 0009, 0001]if($tar=='0000') return 0;$locked =[];foreach ($vec as $d){if($d=='0000') return -1; //初始位置就被锁住了$locked[$d] = $d;}$q = [0=>'0000'];$visited = [];$step = 0;while (count($q) >0){$step++;$qbak = [];$size =count($q);for($i=0;$i<$size;$i++){$status = $q[$i];$nexts = getNexts($status);//比如0000的nexts:  [9000, 1000, 0900, 0100, 0090, 0010, 0009, 0001]foreach ($nexts as $next){if(isset($locked[$next])) continue;if(isset($visited[$next])) continue;if($next==$tar) return $step;$qbak[count($qbak)] = $next;$visited[$next] = $next;}}$q =$qbak;}return  -1;
}// 枚举status通过一次旋转得到的数字
function getNexts($status){$ans = [];$arr = [];for($i=0;$i<4;$i++){$arr[$i] = $status[$i];}for($i=0;$i<4;$i++){$x = $arr[$i];//上一个$prev='9';if($x!='0'){$prev = intval($x)-1;$x.='';}$arr[$i] = $prev;$str = '';for($j=0;$j<4;$j++){$str.=$arr[$j];}$ans[count($ans)] = $str;//下一个$succ = '0';if($x!='9'){$succ=intval($x)+1;$succ.='';}$str = '';$arr[$i] = $succ;for($j=0;$j<4;$j++){$str.=$arr[$j];}$ans[count($ans)] = $str;$arr[$i] = $x;}return $ans;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/11096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言和BASH SHELL中条件表达式的真假与0和1的关系

在C语言中&#xff0c;条件表达式的真假与0和1的关系是非常简单的&#xff1a; 真值&#xff1a;如果条件表达式的结果为非零值&#xff0c;则条件被视为真。假值&#xff1a;如果条件表达式的结果为零值&#xff0c;则条件被视为假。 因此&#xff0c;在C语言中&#xff0c;…

ASP.NET之图像控件

在ASP.NET中&#xff0c;用于显示图像的控件主要是Image控件&#xff0c;Image控件属于ASP.NET Web Forms的一部分&#xff0c;它允许你在Web页面上显示图像。以下是如何在ASP.NET Web Forms中使用 1. 添加Image控件到页面 在ASP.NET Web Forms页面上&#xff0c;你可以通过设…

SpringBoot整合SpringScurity权限控制(菜单权限,按钮权限)以及加上SSH实现安全传输

文章目录 项目地址&#xff1a; 一、md5 与 先进的哈希算法的区别1.1. 安全性问题1.2. 设计目的1.3. 功能特性1.4. 适用性1.5. 总结 二、数据传输安全和数据加密实现&#xff1a;2.1 生成证书&#xff1a;2.2、在springboot中进行集成2.2.1 配置证书&#xff1a;2.2.2. 强制使用…

山东大学机器人实验 matlab部分

山东大学机器人实验 matlab部分 最新更新在Github Github地址吐槽Matlab在Ubuntu里是真的难用感觉Ubuntu配置Matlab的一些问题

4.1 编写程序,从键盘接收一个小写字母,然后找出他的前导字符和后续字符,再按顺序显示这三个字符

方法一&#xff1a; 运行效果&#xff1a; 输入B&#xff0c;输出显示ABC&#xff1b;输入A&#xff0c;输出显示AB 思路&#xff1a; 1、通过键盘输入接收一个字母。 2、将输入的字母减去1&#xff0c;得到前导字符&#xff0c;然后输出。 3、将输入的字母加上1&#xff0c;得…

基础统计概念

这是一个非常适合初学者的选题&#xff0c;因为理解基础统计概念是学习统计学的第一步。下面我会简要解释这些概念&#xff1a; 1. **均值&#xff08;Mean&#xff09;&#xff1a;** 在一组数据中&#xff0c;所有数值的总和除以数据的个数。均值是描述数据集中心位置的一种…

Kafka 环境配置与使用总结

# 部署教程参考 # 官方教程: https://kafka.apache.org/quickstart # 单机部署kafka参考: https://blog.csdn.net/u013416034/article/details/123875299 # 集群部署kafka参考: # https://blog.csdn.net/zhangzjx/article/details/123679453 # https://www.cnblogs.com/And…

社群知识付费系统,如何向家长推销课程话术?有什么方法?

很多培训机构都会遇到和家长谈了很久&#xff0c;但是家长就是不签单的情况&#xff0c;其实销售过程就是“逼单”&#xff0c;要掌握技巧&#xff0c;那像家长推销课程有什么话术&#xff1f; ①盲目型家长 特点&#xff1a;对课程一无所知&#xff0c;目的性比较差&#xff0…

【js下载文本文件】

功能 使用js下载dom的文本内容 原理 a标签下载功能 代码 <p id"p2">66666666</p><button onclick"downloadInnerHtml(filename2,#p2)">下载</button><script>var filename2 新建文档; //默认文本名字function downloa…

【问题实操】银河高级服务器操作系统实例分享,开机之后反复重启

1.服务器环境以及配置 物理机/虚拟机/云/容器 物理机 外网/私有网络/无网络 私有网络 处理器&#xff1a; PHYTIUM FT2000PLUS 2200 MHz 内存&#xff1a; 128 GiB 整机类型/架构&#xff1a; HIKVISION DS-V BIOS版本&#xff1a; HK 601FBE02HK 网卡&#xff1…

云原生技术解析

云原生的概念 云原生是一种软件架构和部署方法&#xff0c;旨在利用云计算的优势&#xff0c;以更灵活、可扩展和可靠的方式构建和部署应用程序。它主要关注在容器、微服务、自动化和持续交付等方面。 云原生技术是指以云计算作为基础&#xff0c;以平台和工具为依托&#xff0…

【免费】2024年全新超强版本itvboxfast如意版影视APP源码 TV+手机双端后台PHP源码

首先&#xff0c;让我们了解一下ITVBox如意版影视源码的特点和优势。这一源码基于先进的技术和框架开发&#xff0c;具有稳定、高效的性能&#xff0c;能够满足影视网站的各种需求。与此同时&#xff0c;该源码还提供了丰富的功能和模块&#xff0c;包括影视资源管理、会员系统…

rs6(vmp)瑞某,药某局,商某局,专某局,维某网,cookie + 后缀 的分析解析

文章目录 说在前面rs vmp 特征 介绍解决方法算法补环境运行报错 代码联调补环境框架 补环境导出结果导出cookie导出后缀 效果展示 vx lyj_txd qq 1416279170 # 加我备注来意说在前面 免责声明&#xff1a; 本篇文章只做学习讨论&#xff0c;无商务用途&#xff0c; 未对目标…

线下研讨会 技术沙龙|乐鑫芯片与 ESP RainMaker® 为科技初创企业赋能

众多科技初创企业在智能硬件市场迅猛发展的背景下&#xff0c;对不断变化的需求展现出了高度的敏锐性&#xff0c;期望能够快速将其转化为切实的产品方案。然而&#xff0c;面对复杂繁重的软硬件集成任务&#xff0c;这些企业往往容易陷入研发瓶颈、资金短缺以及效率低下等多重…

C++内存管理new/delete和new[ ]/delete[ ]

1.c/c内存分布 首先看一段代码 int globalVar 1; static int staticGlobalVar 1; void Test() { static int staticVar 1; int localVar 1; int num1[10] { 1, 2, 3, 4 }; char char2[] "abcd";const char* pChar3 "abcd"; //这里不加const会导致…

汽车客户WiFi问题:WiFi5掉卡,根本原因是PCIE RC没有恢复config space

客户问题&#xff1a;2个不同的汽车客户&#xff08;T&#xff0c;C&#xff09;分别报了2个WiFi 5 掉卡问题。 问题描述&#xff1a; 在MDM4xx with kernel 4.9平台上&#xff0c;尝试做WiFi SSR恢复&#xff0c;发现WiFi5掉卡&#xff0c;PCIE link downr&#xff0c;无法恢…

从 Oracle 到 TiDB,国有大行打造本地生活 APP 新体验

导读 本文介绍了某国有大行推出的本地生活服务类 APP 在数字时代的创新应用实践。该 APP 利用金融科技和互联网平台模式&#xff0c;打造“金融非金融”的线上生态服务平台&#xff0c;满足了用户多样化的生活需求。为应对用户增长和数据量增加带来的挑战&#xff0c;该 APP 决…

【原创】nnUnet V1在win11下的安装与配置

安装之前可以先了解一下论文的主要内容&#xff0c;便于之后网络训练与推理&#xff0c;调试程序。 论文地址&#xff1a;nnU-Net: a self-configuring method for deep learning-based biomedical image segmentation | Nature Methods 也可以从其他博客快速浏览&#xff1a…

Python 利用迭代器or生成器,让小内存也能处理大文件

首先 准备1个log 文件 app.log 它有60000 行数据 from loguru import logger import osdef sample1():log_path get_log_path()with open(log_path, "r") as f:list_logs f.readlines()logger.info("length of app.logs: {}".format(len(list_logs)))# …

计算机网络(网络原理与应用)之高级交换实验------冗余环路与生成树协议

一、实验目的 (1)了解生成树协议的作用&#xff1b; (2)熟悉生成树协议的配置。 二、应用环境 采用生成树协议可以避免环路。 生成树协议的根本目的是将一个存在物理环路的交换网络变成一个没有环路的逻辑树形网络。IEEE802.ID协议通过在交换机上运行一套复杂的算法STA(sp…