华为OD机试双机位C卷 - 快递投放问题 (JAVA Python C++ JS GO)

快递投放问题

华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 200分题型

华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解

题目描述

有N个快递站点用字符串标识,某些站点之间有道路连接。
每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递?

输入描述

  • 第一行输入M N,M个包裹N个道路信息.
  • 0<=M,N<=100,
  • 检查站禁止通行的包裹如果有多个以空格分开

输出描述

  • 输出不能送达的包裹,如:package2 package4,
  • 如果所有包裹都可以送达则输出:none,
  • 输出结果按照升序排列。

用例1

输入

4 2 package1 A C package2 A C package3 B C package4 A C A B package1 A C package2

输出

package2

题解

思路:BFS

  1. 这道题题目太短并且描述也不太准确,通过测试案例和题意结合来看我个人认为的意思: 给定所有包裹的起点和目标终点。然后给出n条线路,其中每条线路表示这两个站点互连,同时这条线路可以禁止某些包裹通过。
  2. 通过1的分析这道题就转换为带有限制的无向图,判断指定路径是否可达。
  3. 通过记录线路站点并且禁止包裹,循环使用BFS判断每个包裹是否能从起点到达终点,不可达的包裹加入结果数组。
  4. 如果不存在不可达包裹,输出none. 否则升序排列之后,按照空格分割输出。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> #include<unordered_set> #include<set> #include<queue> using namespace std; // 边结构 struct Edge { string to; // 目标站点 unordered_set<string> banned; // 禁止通过的包裹 }; // 包裹结构 struct Package { string name; string start; string end; }; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vector<string> split(const string& str, const string& delimiter) { vector<string> result; size_t start = 0; size_t end = str.find(delimiter); while (end != string::npos) { result.push_back(str.substr(start, end - start)); start = end + delimiter.length(); end = str.find(delimiter, start); } // 添加最后一个部分 result.push_back(str.substr(start)); return result; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int m,n; cin >> m >> n; // 忽略换行符 cin.ignore(); vector<Package> packages(m); for (int i = 0; i < m; i++) { string input; getline(cin, input); vector<string> tmp = split(input, " "); packages[i].name = tmp[0]; packages[i].start = tmp[1]; packages[i].end = tmp[2]; } // 存储每个包裹被进制的路线 map<string, vector<Edge>> graph; for (int i = 0; i < n; i++) { string input; getline(cin, input); vector<string> tmp = split(input, " "); unordered_set<string> banned(tmp.begin()+2, tmp.end()); // 无向图,双向加边 graph[tmp[0]].push_back({tmp[1], banned}); graph[tmp[1]].push_back({tmp[0], banned}); } vector<string> res; // BFS判断每个包裹是否可到达 for (auto &pkg : packages) { queue<string> q; unordered_set<string> visited; q.push(pkg.start); visited.insert(pkg.start); bool canReach = false; while (!q.empty()) { string cur = q.front(); q.pop(); if (cur == pkg.end) { canReach = true; break; } if (!graph.count(cur)) continue; for (auto &edge : graph[cur]) { // 如果这条路禁止该包裹,跳过 if (edge.banned.count(pkg.name)) continue; if (!visited.count(edge.to)) { visited.insert(edge.to); q.push(edge.to); } } } if(!canReach) { res.push_back(pkg.name); } } // 都可送达 if (res.empty()) { cout << "none"; return 0; } // 升序 sort(res.begin(), res.end()); // 输出结果 for (int i = 0; i < res.size(); i++) { if (i != 0) { cout << " "; } cout << res[i]; } return 0; }

JAVA

import java.io.*; import java.util.*; // 边结构 class Edge { String to; // 目标站点 Set<String> banned; // 禁止通过的包裹 Edge(String to, Set<String> banned) { this.to = to; this.banned = banned; } } // 包裹结构 class PackageInfo { String name; String start; String end; } public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int m = Integer.parseInt(st.nextToken()); int n = Integer.parseInt(st.nextToken()); List<PackageInfo> packages = new ArrayList<>(); // 读取包裹信息 for (int i = 0; i < m; i++) { st = new StringTokenizer(br.readLine()); PackageInfo pkg = new PackageInfo(); pkg.name = st.nextToken(); pkg.start = st.nextToken(); pkg.end = st.nextToken(); packages.add(pkg); } // 图结构 Map<String, List<Edge>> graph = new HashMap<>(); // 读取道路信息 for (int i = 0; i < n; i++) { st = new StringTokenizer(br.readLine()); String u = st.nextToken(); String v = st.nextToken(); Set<String> banned = new HashSet<>(); while (st.hasMoreTokens()) { banned.add(st.nextToken()); } graph.computeIfAbsent(u, k -> new ArrayList<>()).add(new Edge(v, banned)); graph.computeIfAbsent(v, k -> new ArrayList<>()).add(new Edge(u, banned)); } List<String> res = new ArrayList<>(); // BFS 判断每个包裹是否可达 for (PackageInfo pkg : packages) { Queue<String> q = new LinkedList<>(); Set<String> visited = new HashSet<>(); q.offer(pkg.start); visited.add(pkg.start); boolean canReach = false; while (!q.isEmpty()) { String cur = q.poll(); if (cur.equals(pkg.end)) { canReach = true; break; } if (!graph.containsKey(cur)) continue; for (Edge e : graph.get(cur)) { // 该路径禁止 if (e.banned.contains(pkg.name)) continue; if (!visited.contains(e.to)) { visited.add(e.to); q.offer(e.to); } } } if (!canReach) { res.add(pkg.name); } } if (res.isEmpty()) { System.out.print("none"); } else { Collections.sort(res); System.out.print(String.join(" ", res)); } } }

Python

fromcollectionsimportdeque,defaultdict# 读取 m, nm,n=map(int,input().split())# 读取包裹信息packages=[]for_inrange(m):name,start,end=input().split()packages.append((name,start,end))# 图结构:站点 -> [(目标站点, 禁止包裹集合)]graph=defaultdict(list)# 读取道路信息for_inrange(n):parts=input().split()u,v=parts[0],parts[1]banned=set(parts[2:])graph[u].append((v,banned))graph[v].append((u,banned))res=[]# BFS 判断每个包裹是否可达forname,start,endinpackages:q=deque([start])visited={start}can_reach=Falsewhileq:cur=q.popleft()ifcur==end:can_reach=Truebreakifcurnotingraph:continuefornxt,bannedingraph[cur]:# 路径禁止通过ifnameinbanned:continueifnxtnotinvisited:visited.add(nxt)q.append(nxt)ifnotcan_reach:res.append(name)# 输出结果ifnotres:print("none")else:res.sort()print(" ".join(res))

JavaScript

// ACM 模式(Node.js + readline)constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});letlines=[];rl.on('line',line=>{lines.push(line.trim());});rl.on('close',()=>{letidx=0;// 读取 m, nlet[m,n]=lines[idx++].split(/\s+/).map(Number);// 读取包裹信息letpackages=[];for(leti=0;i<m;i++){let[name,start,end]=lines[idx++].split(/\s+/);packages.push({name,start,end});}// 图结构letgraph=newMap();// 读取道路信息for(leti=0;i<n;i++){letparts=lines[idx++].split(/\s+/);letu=parts[0],v=parts[1];letbanned=newSet(parts.slice(2));if(!graph.has(u))graph.set(u,[]);if(!graph.has(v))graph.set(v,[]);graph.get(u).push({to:v,banned});graph.get(v).push({to:u,banned});}letres=[];// BFS 判断每个包裹是否可达for(letpkgofpackages){letqueue=[pkg.start];letvisited=newSet([pkg.start]);letcanReach=false;while(queue.length>0){letcur=queue.shift();if(cur===pkg.end){canReach=true;break;}if(!graph.has(cur))continue;for(letedgeofgraph.get(cur)){// 如果这条路禁止该包裹,跳过if(edge.banned.has(pkg.name))continue;if(!visited.has(edge.to)){visited.add(edge.to);queue.push(edge.to);}}}if(!canReach){res.push(pkg.name);}}// 输出结果if(res.length===0){console.log("none");}else{res.sort();console.log(res.join(" "));}});

Go

packagemainimport("bufio""fmt""os""sort""strconv""strings")// 边结构typeEdgestruct{tostringbannedmap[string]bool}// 包裹结构typePackagestruct{namestringstartstringendstring}funcmain(){reader:=bufio.NewReader(os.Stdin)// 读取第一行:m nline,_:=reader.ReadString('\n')line=strings.TrimSpace(line)parts:=strings.Fields(line)m,_:=strconv.Atoi(parts[0])n,_:=strconv.Atoi(parts[1])// 读取包裹信息packages:=make([]Package,m)fori:=0;i<m;i++{line,_=reader.ReadString('\n')parts=strings.Fields(line)packages[i]=Package{name:parts[0],start:parts[1],end:parts[2],}}// 图结构graph:=make(map[string][]Edge)// 读取道路信息fori:=0;i<n;i++{line,_=reader.ReadString('\n')parts=strings.Fields(line)u,v:=parts[0],parts[1]banned:=make(map[string]bool)for_,p:=rangeparts[2:]{banned[p]=true}graph[u]=append(graph[u],Edge{to:v,banned:banned})graph[v]=append(graph[v],Edge{to:u,banned:banned})}res:=[]string{}// BFS 判断每个包裹是否可达for_,pkg:=rangepackages{queue:=[]string{pkg.start}visited:=map[string]bool{pkg.start:true}canReach:=falseforlen(queue)>0{cur:=queue[0]queue=queue[1:]ifcur==pkg.end{canReach=truebreak}for_,e:=rangegraph[cur]{// 如果这条路禁止该包裹,跳过ife.banned[pkg.name]{continue}if!visited[e.to]{visited[e.to]=truequeue=append(queue,e.to)}}}if!canReach{res=append(res,pkg.name)}}// 输出结果iflen(res)==0{fmt.Print("none")}else{sort.Strings(res)fmt.Print(strings.Join(res," "))}}

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

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

相关文章

【毕业设计】基于python-CNN深度学习训练识别手势方向

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

吐血推荐10个AI论文软件,研究生轻松搞定毕业论文!

吐血推荐10个AI论文软件&#xff0c;研究生轻松搞定毕业论文&#xff01; 论文写作的“救星”来了&#xff0c;AI 工具如何改变研究生的学术之路 在当今信息爆炸的时代&#xff0c;研究生们面对毕业论文的压力日益增大。从选题、开题到撰写、查重&#xff0c;每一个环节都充满…

基于STM32的智能家居环境监测与控制系统设计

基于STM32的智能家居环境监测与控制系统设计摘要本论文设计并实现了一种基于STM32F103C8T6单片机的智能家居环境监测与控制系统。系统通过集成多参数环境传感器&#xff0c;构建了完整的家居环境感知-决策-执行闭环&#xff0c;实现了对室内温湿度、烟雾浓度、一氧化碳、空气质…

深度学习计算机毕设之基于python-CNN深度学习机器学习训练识别手势方向

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

AI应用架构师必学:弹性扩展中的容错设计

AI应用架构师必学&#xff1a;弹性扩展中的容错设计 关键词&#xff1a;AI 应用架构、弹性扩展、容错设计、分布式系统、可靠性、可用性 摘要&#xff1a;本文深入探讨了 AI 应用架构师在弹性扩展场景下进行容错设计的关键要点。首先阐述了相关概念的基础&#xff0c;追溯其历史…

深度学习毕设选题推荐:基于python-CNN机器学习深度学习训练识别手势方向

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【毕业设计】基于python-CNN深度学习卷积神经网络训练识别不同颜色的裤子识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

深度学习毕设选题推荐:基于人工智能python-CNN卷积神经网络训练识别不同颜色的裤子识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

深度学习毕设项目:基于python-CNN深度学习训练识别手势方向

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

数据一边跑,隐私不能裸奔:聊聊流处理里的差分隐私怎么玩

数据一边跑&#xff0c;隐私不能裸奔&#xff1a;聊聊流处理里的差分隐私怎么玩做流处理这些年&#xff0c;我越来越有一种感觉&#xff1a; 数据跑得越快&#xff0c;出事的速度也越快。 以前做离线分析&#xff0c;数据躺在仓库里&#xff0c;权限一管&#xff0c;脱敏一做&a…

计算机深度学习毕设实战-基于卷神经网络python-CNN深度学习训练识别手势方向

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

0.9V-5V转5V DC-DC升压模块原理图设计,已量产

目录 1、电路架构与核心选型 2、性能参数与实测验证 3、设计优化与踩坑总结 4、应用场景 在低功耗便携设备或应急供电场景中,输入电源电压波动大是常见痛点:单节碳性电池放电末期电压低至 0.9V,锂电池标称 3.7V,还有 USB 5V 输入。为了给 5V 设备(如 USB 小风扇、蓝牙…

一次看似普通的订单统计,为什么却成了算法与业务理解的分水岭?——聊聊《行程和用户(Trips and Users)》

一次看似普通的订单统计,为什么却成了算法与业务理解的分水岭?——聊聊《行程和用户(Trips and Users)》 如果你刷过 LeetCode 的 SQL 题,《Trips and Users(行程和用户)》 这道题,大概率让你停下来认真想过。 它不像那种“join 一下、group by 一下就完事”的题, 也…

计算机深度学习毕设实战-基于机器学习python-CNN卷积神经网络训练识别不同颜色的裤子识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Type-C接口3.7V锂电池充电模块原理图设计,已量产

目录 1、核心芯片:TP4056X 线性充电 IC 2、电路模块深度解析 2.1、Type-C 输入接口电路 2.2、充电电流切换电路 2.3、智能 LED 指示电路 在便携设备与低功耗 IoT 应用爆发的今天,单节 3.7V 锂电池的充电方案早已成为硬件工程师的 “日常课题”。今天我们拆解的这款充电板…

FPGA 工程师到底有哪些方向?每个岗位都在干什么?一篇给你讲清楚

很多人说“学 FPGA 就是写 Verilog”&#xff0c;但真正进了行业才发现—— FPGA 工程师并不是一个岗位&#xff0c;而是一整个岗位族群。不同公司、不同项目&#xff0c;对 FPGA 工程师的要求差异非常大。 如果方向选错&#xff0c;可能学了半年发现岗位根本不对口。这篇文章就…

软件测试面试全攻略之初级篇

博主正在参加CSDN的博客之星评选&#xff0c; 如果本博文解决了你的问题&#xff0c;或者给了你一点启发&#xff0c;可以请点击以下链接投票支持一下吗&#xff1f; 投票链接&#xff1a; https://www.csdn.net/blogstar2025/detail/056 感谢每一个点赞、收藏和投票的你&…

从嵌入式转向 FPGA,他用 6 个月拿下 15K Offer|真实学员回访

这是学员 L 同学 在入职当天给我们发来的第一句话&#xff1a;“不是嵌入式不好&#xff0c;是我发现自己更适合 FPGA。”他并不是应届生&#xff0c;而是一名有 2 年嵌入式开发经验 的工程师。 从 STM32、RTOS&#xff0c;到驱动调试、板级联调&#xff0c;他都做过&#xff0…

调完模型别抓瞎!手把手教你评估大语言模型微调效果

引言:为什么评估如此关键? 想象一下,你为了某个特定任务(比如让模型成为你公司的“法律文档助手”或“创意文案专家”),精心准备了数据,耗费了算力,对一个大模型进行了微调。模型训练完成了,你兴冲冲地输入一…

【安卓投屏】Escrcpy体验:比ADB更便捷的图形化手机投屏控制工具

对于开发者和技术爱好者来说&#xff0c;Scrcpy因其高性能和低延迟特性成为安卓投屏的首选方案&#xff0c;但其命令行操作方式对新手不够友好。Escrcpy​ 作为Scrcpy的图形化外壳&#xff0c;在保留全部核心功能的同时&#xff0c;通过Electron技术提供了直观的可视化操作界面…