牛客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,一经查实,立即删除!

相关文章

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. 强制使用…

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

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

【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会导致…

从 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…

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

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

JupyterLab OpenCV展示图片

JupyterLab OpenCV展示图片 方式一 注意&#xff1a;此种方式如果在远程服务器上的JupyterLab上运行&#xff0c;可能会出现错误。 import cv2# 读取图片 image cv2.imread(photo/blg.png)# 显示图片 cv2.imshow(image, image)# 等待按键&#xff0c;之后关闭所有窗口 cv2.w…

Deckset for Mac:让演示文稿制作更轻松

还在为繁琐的演示文稿制作而烦恼吗&#xff1f;Deckset for Mac来帮您解决&#xff01;它支持Markdown语言&#xff0c;让您只需专注于内容的创作&#xff0c;无需在排版和设计上耗费过多精力。丰富的主题和布局选项&#xff0c;让您能够轻松打造出专业级的演示文稿。快来体验D…

我的 OpenLiteSpeed 从开始到放弃之经历

昨晚下定决心放弃 OpenLiteSpeed 了&#xff0c;从开始到放弃历时七天。总结下来放弃 OpenLiteSpeed 主要是实在不适合明月当前的需要&#xff0c;用起来不是锦上添花而是个累赘了都&#xff0c;今天明月就给大家总结分享一下这次 OpenLiteSpeed 从开始到放弃的经历。 一、Ngin…

LLM量化

Efficient Finetuning prefix tuning 针对每种任务&#xff0c;学习prefix vector 启发于prompting&#xff0c;调整上下文内容让模型去输出自己想要的内容 核心就是找到一个上下文去引导模型解决NLP生成任务 传统情况下&#xff0c;我们为了得到想要的结果&#xff0c;会…

语言:C#

一、VSCode生成exe 二、

EasyRecovery(易恢复) 使用测试及详细使用方法

你有没有因为数据丢失懊悔不已&#xff0c;EasyRecovery&#xff08;易恢复&#xff09;&#xff0c;来自美国拥有38年数据恢复的软件&#xff0c;只有收费版&#xff0c;重要事情说三遍&#xff0c;EasyRecovery 没有免费版&#xff0c;可以成功找回删除的部分文件&#xff0c…

SQLite .journal 文件

在之前插入大量数据测试的时候&#xff0c;发现在数据库文件同级目录下会产生一个同名.journal的文件&#xff0c;并且不是一直会存在&#xff0c;而是生成一会就会自动删除&#xff0c;然后继续生成继续删除&#xff0c;直到数据插入完成。 初步猜测&#xff0c;应该是类似 re…

增强客户黏性:服装实体店扫码连锁收银软件提供多样的会员营销策略

随着消费者对购物体验的需求不断提升&#xff0c;服装实体店面临着更大的挑战和机遇。为了增强客户黏性&#xff0c;提升销售业绩&#xff0c;越来越多的服装实体店开始引入扫码连锁收银软件&#xff0c;并提供多样化的会员营销策略。这一举措不仅为店铺提供了更加智能化的经营…