牛客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] = true
		if d == "0000" {
			return -1 //初始位置就被锁住了
		}
	}

	q := []string{}
	visited := map[string]bool{}
	step := 0
	q = 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] = prev
		ans = append(ans, string(arr))

		//下一个
		var succ byte = '0'
		if x != '9' {
			succ = x + 1
		}
		arr[i] = succ
		ans = 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在PyQt5中实现点击按钮打开新窗口功能—窗口的跳转功能实现

百度搜索“pyqt5中如何点击按钮打开新的窗口”&#xff0c;自动生成以下参考代码。 在PyQt5中&#xff0c;要实现点击按钮打开新窗口&#xff0c;你需要定义一个新的窗口类&#xff0c;并在按钮的点击信号&#xff08;clicked&#xff09;处理函数中创建并显示这个新窗口。以下…

Eclipse 里如何建立SAP应用服务层的CDS

关于Core Data Service(CDS) CDS:Core Data Ser vice.核心数据服务。CDS 是使用基于 SQL的数据定义语言(DDL)定义的&#xff0c;该语言基于标准 SQL 并带有一些附加概念。使用类似 SQL的灵活表达式可以进行复杂的数据建模。有两种类型的 CDS:ABAP CDS 和 HANA CDS。 S/4 HANA…

安装HTTPS证书后,网站安全性会有哪些提升?

在当今数字化时代&#xff0c;网络安全已成为一个不可忽视的话题。随着网络攻击的日益频繁&#xff0c;保护网站和用户数据的安全变得尤为重要。HTTPS作为一种加密的HTTP协议&#xff0c;为我们提供了一种安全的网络数据传输方式。本文将详细介绍HTTPS的工作原理、端口号以及如…

测试docker GPU性能损失

NVIDIA 3090 利用HSOpticalFlow代码测试docker GPU性能损失 docker介绍图如下&#xff1a; 形象生动展示了他们之间的关系 今天要测试docker容器运行HSOpticalFlow算法的性能损失&#xff0c;包括CPU和GPU 上一篇博客 http://t.csdnimg.cn/YW5kE 我已经介绍了使用docker和nvid…

如何判断海外住宅ip的好坏?

在海外IP代理中&#xff0c;住宅IP属于相对较好的资源&#xff0c;无论是用于工作、学习、还是娱乐&#xff0c;都能得到较好的使用效果。作为用户&#xff0c;该如何判断海外住宅IP的好坏呢&#xff1f; 稳定性与可靠性&#xff1a;海外住宅IP相比动态IP地址&#xff0c;通常具…

国际数字影像产业园近期活动一览

一、4月23日&#xff0c;在数媒大厦的春日里&#xff0c;我们共同迎来了第29个“世界读书日"。由数字影像联合工会委员会、树莓科技&#xff08;成都&#xff09;集团有限公司工会委员会主办&#xff0c;成都树莓信息技术有限公司、四川聚能文化传播公司承办的「共沐书香 …

“AI换脸”“一键脱衣” AI诈骗正在进行

这两年AI技术快速发展&#xff0c;从AI变声到AI换脸&#xff0c;AI技术在给我们带来震撼的同时&#xff0c;也有心术不正的人利用它做坏事。比如&#xff0c;近来媒体常报道的“一键脱衣”案件&#xff0c;一位广州女生在地铁拍的美照&#xff0c;被个别网友&#xff0c;用AI一…

(值得拥有)项目框架构建之7:提供工业互联网的框架基础,本文附带框架基础源码

很多读者&#xff0c;可能只是匆匆一看&#xff0c;感觉没啥东西。 但我要特意提醒各位读者&#xff1a;此源码&#xff0c;可是非常有价值的东西。我不一定会一直开放。 前述文章曾讲解了大概如何构建一个项目框架&#xff0c;本意是好的&#xff0c;无奈框架这种思想性的东西…

react18【系列实用教程】组件 (2024最新版 | 含父子组件传值、兄弟组件传值、越层组件传值、“插槽“)

什么是组件&#xff1f; 一个组件就是用户界面的一部分&#xff0c;它可以有自己的逻辑和外观。 组件之间可以互相嵌套&#xff0c;也可以复用多次 为什么要用组件&#xff1f; 组件能让开发者像搭积木一样快速构建一个完整的庞大应用&#xff0c;大大提升了开发效率&#xff…

【MySQL数据库】丨高可用之MHA集群部署

一、准备工作 1.1 修改主机名 vim /etc/hosts# 添加对应主机 192.168.28.128 mha1 192.168.28.131 mha2 192.168.28.132 mha31.2 关闭防火墙及修改selinux # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭自启动# 修改selinux vim /etc/sy…

EasyImage2.0 图床源码

EasyImage2.0 是一个简单图床的源码&#xff0c;它支持以下功能&#xff1a; 1. API接口 2. 登录后才能上传图片 3. 设置图片质量 4. 压缩图片大小 5. 添加文字或图片水印 6. 设定图片的宽度和高度 7. 将上传的图片转换为指定的格式 8. 限制上传图片的最小宽度和高度 …

基于STC12C5A60S2系列1T 8051单片机实现一主单片机发送数据给一从单片机接收并返回数据给主单片机的串口通信功能

基于STC12C5A60S2系列1T 8051单片机实现一主单片机发送数据给一从单片机接收并返回数据给主单片机的串口通信功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片…

langchain_community切分各种文档数据;加载向量模型;使用向量库

参考: https://github.com/langchain-ai/langchain https://api.python.langchain.com/en/latest/community_api_reference.html https://github.com/shibing624/ChatPilot/blob/384f18e4f10f87e10f104f9ff57f02c655588035/chatpilot/apps/rag_app.py 安装: pip instal…

# 从浅入深 学习 SpringCloud 微服务架构(十八)

从浅入深 学习 SpringCloud 微服务架构&#xff08;十八&#xff09; 一、开源配置中心 Apollo&#xff1a;概述 1、开源配置中心 Apollo Apollo -A reliable configuration management system Apollo(阿波罗)是携程框架部门研发的分布式配置中心&#xff0c;能够集中化管理…

Gitlab、Redis、Nacos、Apache Shiro、Gitlab、weblogic相关漏洞

文章目录 一、Gitlab远程代码执行&#xff08;CVE-2021-22205&#xff09;二、Redis主从复制远程命令执行三、Nacos认证绕过漏洞&#xff08;CVE-2021-29441&#xff09;四、Apache Shiro认证绕过漏洞&#xff08;CVE-2020-1957&#xff09;五、Gitlab任意文件读取漏洞&#xf…

北亚MF2200手机取证平台介绍

一、产品介绍。 北亚MF2200手机取证平台是由北亚企安科技&#xff08;北京&#xff09;有限公司&#xff08;Frombyte&#xff09;自主研发的一款针对智能手机&#xff08;iPhone、Android&#xff09;及 iPad 取证分析的法证平台。本平台采集速度快&#xff0c;可通过自动提取…

如何选择沙发3D模型下载?

在家具沙发定制过程中&#xff0c;选择合适的沙发3D模型可以方便地进行沟通&#xff0c;让双方能够更清晰地了解对方的设想。此外&#xff0c;通过3D模型&#xff0c;双方还可以更方便地对设计方案进行修改和完善。那么如何选择合适的沙发3D模型下载? 1.确定预算 在选择沙发3D…

一篇文章告诉你:通信网优比计算机岗位好在哪?

据优橙2023年就业人员专业分布统计&#xff0c;通信专业学员占比32.7%&#xff0c;非通信专业学员占比64.8%&#xff0c;其他占比2.5%。 可见从事网优的学员中大部分为非通信专业。而非通信专业中72%的学生在学习通信网优还是计算机专业中&#xff0c;选择了通信网优。 为什么越…

C# WinForm —— 14 CheckedListBox 复选列表框介绍

1. 简介 类似 ListBox&#xff0c;提供项的列表&#xff0c;区别就是 CheckedListBox 每一个项前面有个复选框 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般以 ckl 开头BackColor背景颜色BoderStyle边框样式&#xff1a;无、FixedSingle、F…

【错误的集合】力扣python

最初想法 def findErrorNums(nums):n len(nums)duplicate -1missing -1for num in nums:if nums[abs(num) - 1] < 0:duplicate abs(num)else:nums[abs(num) - 1] * -1for i in range(n):if nums[i] > 0:missing i 1breakreturn [duplicate, missing] 遇到力扣大佬…