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

news2024/10/6 2:22:47

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题目链接:
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;
}

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

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

相关文章

文件系统(未打开的文件)

之前我们讲述的一些文件操作都是在文件被打开的基础上的&#xff0c;因为用户想要对某个文件做操作的话&#xff0c;这个文件一定是被打开的&#xff0c;也就是一定是内存级的文件。 但是有的没有被操作的文件&#xff0c;是在磁盘中的&#xff0c;我们的笔记本是在SSD中&…

Debian Linux 下给Nginx 1.26.0 编译增加Brotli算法支持

明月发现参考【给Nginx添加谷歌Brotli压缩算法支持】一文给出的方法&#xff0c;在Debian Linux 12.5下就一直编译失败&#xff0c;主要的错误是因为文件缺失&#xff0c;在专门又安装了apt-get install libbrotli-dev的依赖库后依然会因为文件缺失无法编译完成&#xff0c;就这…

JCR一区 | Matlab实现1D-2D-GASF-CNN-BiLSTM-MATT的多通道输入数据分类预测

JCR一区 | Matlab实现1D-2D-GASF-CNN-BiLSTM-MATT的多通道输入数据分类预测 目录 JCR一区 | Matlab实现1D-2D-GASF-CNN-BiLSTM-MATT的多通道输入数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 Matlab实现1D-2D-GASF-CNN-BiLSTM-MATT的多通道输入数据分类预…

Postman基础功能-常见类型的接口请求

天空灰暗到一定程度&#xff0c;星辰就会熠熠生辉。大家好&#xff0c;之前给大家分享了关于 Postman 工具的介绍以及安装&#xff0c;在当今数字化的时代&#xff0c;接口请求在软件开发和系统集成中扮演着至关重要的角色。而 Postman 作为一款强大且广受认可的接口测试工具&a…

信息系统项目管理师0105:项目评估与决策(7项目立项管理—7.3项目评估与决策)

点击查看专栏目录 文章目录 7.3项目评估与决策1.评估依据2.评估的程序3.项目评估的内容4.项目评估报告内容大纲记忆要点总结7.3项目评估与决策 项目评估指在项目可行性研究的基础上,由第三方(国家、银行或有关机构)根据国家颁布的政策、法规、方法、参数和条例等,从国民经济…

Java | Leetcode Java题解之第77题组合

题目&#xff1a; 题解&#xff1a; class Solution {List<Integer> temp new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public List<List<Integer>> combine(int n, int k) {List&l…

[Spring Cloud] (7)gateway防重放拦截器

文章目录 简述本文涉及代码已开源Fir Cloud 完整项目防重放防重放必要性&#xff1a;防重放机制作用&#xff1a; 整体效果后端进行处理 后端增加防重放开关配置签名密钥 工具类防重放拦截器 前端被防重放拦截增加防重放开关配置请求头增加防重放签名处理防重放验证处理函数bas…

信息系统项目管理师0104:详细可行性研究(7项目立项管理—7.2项目可行性研究—7.2.3详细可行性研究)

点击查看专栏目录 文章目录 7.2.3详细可行性研究1.详细可行性研究的依据2.详细可行性研究的原则3.详细可行性研究的方法4.详细可行性研究的内容5.详细可行性研究报告记忆要点总结7.2.3详细可行性研究 详细可行性研究是在项目决策前对与项目有关的技术、经济、

14.CAS原理

文章目录 CAS原理1.什么是CAS2.Unsafe类中的CAS方法2.1.获取UnSafe实例2.2.调用UnSafe提供的CAS方法2.3.调用Unsafe提供的偏移量相关2.4.CAS无锁编程2.4.1.使用cas进行无锁安全自增案例 CAS原理 由于JVM的synchronized重量级锁设计操作系统内核态下的互斥锁的使用&#xff0c;其…

Web安全:SQL注入之布尔盲注原理+步骤+实战操作

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

5款可用于LLMs的爬虫工具/方案

5款可用于LLMs的爬虫工具/方案 Crawl4AI 功能: 提取语义标记的数据块为JSON格式&#xff0c;提供干净的HTML和Markdown文件。 用途: 适用于RAG&#xff08;检索增强生成&#xff09;、微调以及AI聊天机器人的开发。 特点: 高效数据提取&#xff0c;支持LLM格式&#xff0c;多U…

天龙怀旧游戏python脚本

设置图&#xff1a; 游戏窗口最大化。 海贼洞这里定位你要回点的定位。 运行bat就行&#xff0c;脚本出错了还是会重新运行脚本&#xff0c;运行自动启动&#xff0c;end暂停脚本&#xff0c;home重新启动脚本 1. 我常用的是内挂回点脚本&#xff0c; 下面都是前台脚本&…

【适用全主题】WordPress原创插件:弹窗通知插件 支持内容自定义

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 适用于所有WordPress主题的弹窗插件 一款WordPress原创插件&#xff1a;弹窗通知插件 支持内容自定义 二、效果展示 1.部分代码 代码如下&#xff08;示例&#xff09;&#xff1…

Oracle如何收缩减小表空间大小

比如我们发现一个表空间占用比较大&#xff0c;但是空闲空间很大&#xff0c;想要减小表空间占用大小。查看表空间的情况 发现BETEST表空间占用大&#xff0c;但是剩余大小比较大&#xff0c;可以减小存储占用。 如果我们想减小到100MB&#xff0c;那么就登录其用户执行&#…

Python | Leetcode Python题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; class Solution:def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]:sml_dummy, big_dummy ListNode(0), ListNode(0)sml, big sml_dummy, big_dummywhile head:if head.val < x:sml.next headsml sm…

IDEA及Maven配置代理及Maven中央仓库配置详解

一、配置代理 首先&#xff0c;需要本地开启代理入口&#xff0c;如图。 这个跟你使用代理软件有关。像我使用的是qv2ray。 其次&#xff0c;idea配置代理&#xff0c;如图。 1.1 idea配置代理 打开Settings&#xff0c;如图 1.2 maven配置代理 maven配置代理&#xff0c;修…

【JavaEE】Spring Boot 入门:快速构建你的第一个 Spring Boot 应用

目录 第一个SpringBoot程序介绍项目创建创建项目目录介绍输出Hello World 第一个SpringBoot程序 介绍 在学习SpringBoot之前, 我们先来认识⼀下Spring 我们看下Spring官⽅(https://spring.io/)的介绍 可以看到, Spring让Java程序更加快速, 简单和安全. Spring对于速度、简单…

Android 系统全局Bug日志监听

一、Android DropBox Android用来持续化存储系统数据的一个管理类&#xff0c;主要用于记录Android运行过程中&#xff0c;内核、系统j进程、用户进程等出现严重问题时的Log&#xff0c;可以认为它就是一个可持续存储系统级别的Logcat. 日志储存位置&#xff1a;/data/system…

Golang | Leetcode Golang题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; func partition(head *ListNode, x int) *ListNode {small : &ListNode{}smallHead : smalllarge : &ListNode{}largeHead : largefor head ! nil {if head.Val < x {small.Next headsmall small.Next} else {large.Next hea…

云计算第十二课

安装虚拟机 第一步新建虚拟机 选择自定义安装 下一步 选择稍后安装操作系统 选择系统类型和版本 选择虚拟机文件路径&#xff08;建议每台虚拟机单独存放并且路径不要有中文&#xff09;点击下一步 选择bios下一步 选择虚拟机处理器内核数量 默认硬盘或者自行调大硬盘 选择虚…