PAT 1178 File Path

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这一题的大意是给出了一个windows的文件夹目录,让我们按照所属的目录关系,来找相应的目录是否存在,如果存在,就输出找到该文件的路径,如果不存在输出error
我的思路是用合适的树形结构保存下来目录的所属关系,然后用dfs遍历树的方式,递归查找要求的目录,在递归的过程中用数组保存路径,最后跑完dfs,判断这个数组是不是为空,不为空输出数组即可。
可以画出树形结构图,来根据图示写树形结构
我的思路是:

struct node
{vector<int> data;//当前深度有哪些节点 vector<vector<int>> child;//它们的孩子有哪些//其中要标记谁是谁的孩子。 
}tree[1005];

我看网上有题解用哈希表存储的,但我看到题的第一眼就想出这样的存图方式。。。
事实证明这样写也是可以的,存储输入的方式如下:

cin>>N;getchar();for(int i=0;i<N;i++){tree[i].child.resize(105);} for(int i=0;i<N;i++){string s;getline(cin,s);int level=s.size()-4;//表示处于哪一层 string temp=s.substr(level,4);int x=stoi(temp);//最多有maxx层 if(maxx<level){maxx=level;}//表示第level层的数据 tree[level].data.push_back(x);if(level!=0){//如果不是根节点,那么需要把该节点它的父亲找到 //因为输入的原因,一个节点的父亲一定是它上一层节点的最后一个 int nowlast=tree[level-1].data.size()-1;//这就是最后一个 //所以上一个节点的孩子节点有着落了 tree[level-1].child[nowlast].push_back(x);}}/*for(int i=0;i<N;i++){for(int j=0;j<tree[i].data.size();j++){cout<<tree[i].data[j]<<" ";cout<<endl;for(int k=0;k<tree[i].child[j].size();k++){cout<<tree[i].child[j][k]<<" ";}cout<<endl;}cout<<endl;}*/int K;cin>>K;//输入K次询问 for(int i=0;i<K;i++){int q;cin>>q;flag=0;//对于每一次询问,我们去找是否在树中有这个点。 //从根节点开始找 dfs(0,0,q);if(ans.size()!=0){for(int j=0;j<ans.size();j++){if(j!=0)cout<<"->";printf("%04d",ans[j]);}cout<<endl;ans.clear();}else{cout<<"Error: "<<q<<" is not found.";cout<<endl;} }

我们用结构体来构造一个树的某一层的节点情况,tree[i]表示第i层的情况,这一层有多少个节点,每一个节点有哪些孩子(用二维数组来存储),在dfs的时候,我们只需要判断这一层的节点是不是上一层节点的孩子,如果是,就可以继续从这个节点往下走,如果不是则去找这一层的其他节点,同样的判断是不是上一层节点的孩子,如果是,可以继续dfs下一层。
如果某一层的某一个节点等于要找的节点直接标记后,不停return即可。
如果dfs的深度比给出的最大层数要大,则return(递归边界)
完整代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <unordered_map>
#include <limits.h>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
int N;
struct node
{vector<int> data;//当前深度有哪些节点 vector<vector<int>> child;//它们的孩子有哪些//其中要标记谁是谁的孩子。 
}tree[105];
int maxx;
bool flag=0;
vector<int> ans;
void dfs(int level,int now,int q)
{//如果当前层比最高层还要大,说明要返回了,递归边界 if(level>maxx){return;}else{//假设现在是第0层//那么我们需要看一下第0层有没有符合条件的//第0层不用管是不是上一个的孩子//但以后需要管 for(int i=0;i<tree[level].data.size();i++){if(level!=0){//必须保证是符合题目要求的 //才可以选择继续 //我们只需判断这里的节点是不是上一层它的父亲的孩子 bool f=0; //从上一次父亲的孩子中以一比对 for(int j=0;j<tree[level-1].child[now].size();j++){if(tree[level-1].child[now][j]==tree[level].data[i]){//说明是,可以往后面进行 ans.push_back(tree[level].data[i]); //cout<<ans.back()<<" "; f=1;break;}}if(f==0){continue;}}else{ans.push_back(tree[level].data[i]);//cout<<ans.back()<<" "; }if(tree[level].data[i]==q){//说明符合条件flag=1;return;//反之不符合	}	//在这个层没有找到q,往下一层找,找的时候注意保证,下一层的节点是上一层i的孩子 dfs(level+1,i,q);if(flag==1){return ;}ans.pop_back();} }
}
int main()
{//ios::sync_with_stdio(0),cin.tie(0),cout.tie(cin>>N;getchar();for(int i=0;i<N;i++){tree[i].child.resize(105);} for(int i=0;i<N;i++){string s;getline(cin,s);int level=s.size()-4;//表示处于哪一层 string temp=s.substr(level,4);int x=stoi(temp);//最多有maxx层 if(maxx<level){maxx=level;}//表示第level层的数据 tree[level].data.push_back(x);if(level!=0){//如果不是根节点,那么需要把该节点它的父亲找到 //因为输入的原因,一个节点的父亲一定是它上一层节点的最后一个 int nowlast=tree[level-1].data.size()-1;//这就是最后一个 //所以上一个节点的孩子节点有着落了 tree[level-1].child[nowlast].push_back(x);}}/*for(int i=0;i<N;i++){for(int j=0;j<tree[i].data.size();j++){cout<<tree[i].data[j]<<" ";cout<<endl;for(int k=0;k<tree[i].child[j].size();k++){cout<<tree[i].child[j][k]<<" ";}cout<<endl;}cout<<endl;}*/int K;cin>>K;//输入K次询问 for(int i=0;i<K;i++){int q;cin>>q;flag=0;//对于每一次询问,我们去找是否在树中有这个点。 //从根节点开始找 dfs(0,0,q);if(ans.size()!=0){for(int j=0;j<ans.size();j++){if(j!=0)cout<<"->";printf("%04d",ans[j]);}cout<<endl;ans.clear();}else{cout<<"Error: "<<q<<" is not found.";cout<<endl;} }return 0;} 

在写的时候我一开始有一个bug一直修正不了:
该continue的地方写成了break,导致少比较一些节点。
最后借助ai才搞定,中间不停的怀疑自己的思路究竟对不对,
自己的debug能力仍需要提升。

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

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

相关文章

云原生部署_k8s入门

K8S官网文档&#xff1a;&#xfeff;https://kubernetes.io/zh/docs/home/Kubernetes是什么Kubernetes 是用于自动部署、扩缩和管理容器化应用程序的开源系统。 Kubernetes 源自 &#xff0c;Google 15 年生产环境的运维经验同时凝聚了社区的最佳创意和实践。简称K8s.Kubernet…

实战项目-----Python+OpenCV 实现对视频的椒盐噪声注入与实时平滑还原”

实战项目实现以下功能&#xff1a;功能 1&#xff1a;为视频每一帧添加椒盐噪声作用&#xff1a;模拟真实环境中图像传输或采集时可能出现的噪声。实现方式&#xff1a;读取视频的每一帧。随机选择 10000 个像素点&#xff0c;将其设置为黑色&#xff08;0&#xff09;或白色&a…

Day42 PHP(mysql注入、跨库读取)

一、sql注入基本原理&#xff1a;没有对用户输入的数据进行限制&#xff0c;导致数据库语句可以做什么&#xff0c;用户就可以做什么。取决于不同数据库的不同查询语言&#xff0c;所以为什么有mysql注入/orcale注入等等。步骤&#xff1a;【access】表名&#xff08;字典爆破来…

机器人控制器开发(部署——软件打包备份更新)

文章总览 为什么做备份更新 为机器人控制器设计一套打包备份更新机制&#xff0c;为控制器的批量生产和产品与项目落地做准备。 当某个模块出现bug需要升级时&#xff0c;用户可以快速获取正确的bak包并导入到控制器中重启生效。 如果没有做好软件的备份更新机制&#xff0c…

LaTeX TeX Live 安装与 CTAN 国内镜像配置(Windows / macOS / Linux 全流程)

这是一份面向国内环境的 LaTeX 从零到可编译 指南&#xff1a;覆盖 TeX Live / MacTeX 安装、PATH 配置、CTAN 国内镜像&#xff08;清华/北外/上交/中科大等&#xff09;一键切换与回滚、常见坑位&#xff08;权限、镜像路径、版本切换&#xff09;、以及 XeLaTeX/latexmk 的实…

WhoisXML API再次荣登2025年美国Inc. 5000快速成长企业榜单

WhoisXML API非常自豪地宣布&#xff0c;我们再次荣登美国权威榜单——2025年Inc.5000全美成长最快的私营企业之一。今年&#xff0c;公司在地区排名中位列第119名&#xff0c;在全美总体排名中位列第4,271名。Inc. 5000榜单要求参评企业必须保持独立运营&#xff0c;并在2021至…

Elasticsearch面试精讲 Day 9:复合查询与过滤器优化

【Elasticsearch面试精讲 Day 9】复合查询与过滤器优化 在Elasticsearch的搜索体系中&#xff0c;复合查询&#xff08;Compound Queries&#xff09;与过滤器&#xff08;Filters&#xff09;优化是构建高效、精准搜索逻辑的核心能力。作为“Elasticsearch面试精讲”系列的第…

Android使用ReactiveNetwork监听网络连通性

引入库 implementation com.github.pwittchen:reactivenetwork-rx2:3.0.8监听网络连接变更ReactiveNetwork.observeNetworkConnectivity(context).subscribeOn(Schedulers.io())// ... // anything else what you can do with RxJava.observeOn(Schedulers.computation()).subs…

基于阿里云部署 RustDesk 自托管服务器

基于阿里云部署 RustDesk 自托管服务器一、背景与需求场景二、什么是 RustDesk&#xff1f;为什么选择自托管&#xff1f;2.1 RustDesk 是什么&#xff1f;2.2 为什么选择自托管&#xff1f;三、环境准备与架构说明四、操作步骤4.1 在阿里云上安装 RustDesk 服务端4.1.1 下载并…

细说分布式ID

针对高并发写&#xff0c;分布式ID是其业务基础&#xff0c;本文从一个面试题细细展开。面试官&#xff1a;1.对于Mysql的InnoDB引擎下&#xff0c;自增ID和UUID作为主键各自有什么优劣&#xff0c;对于一张表的主键你建议使用哪种ID&#xff1f;2.除了UUID是否还了解其他类型的…

2025年大数据专业证书报考指南:专科学历必看的8大选择​

对于大专学历的同学来说&#xff0c;2025年进入大数据行业是一个充满机遇的选择。大数据领域发展迅速&#xff0c;各类证书能够帮助求职者提升专业能力、增强就业竞争力。其中最推荐的是CDA数据分析师&#xff0c;这个证书适应了未来数字化经济和AI发展趋势&#xff0c;难度不高…

Python爬虫实战:研究Axis Artist模块,构建电商数据采集和分析系统

1. 引言 1.1 研究背景与意义 在大数据时代,互联网上蕴藏着海量有价值的信息,这些信息涵盖了社会、经济、科技等各个领域。高效地从互联网获取数据并进行深度分析,对于企业决策、学术研究、市场分析等都具有重要意义。Python 作为一种功能强大的编程语言,凭借其丰富的库支…

突破大语言模型推理瓶颈:深度解析依赖关系与优化策略

突破大语言模型推理瓶颈&#xff1a;深度解析依赖关系与优化策略当ChatGPT需要5秒才能生成一个回答&#xff0c;当企业级大模型每秒只能处理3个用户请求——这些性能瓶颈的背后&#xff0c;隐藏着大语言模型推理计算中复杂的依赖关系网。在大语言模型推理过程中&#xff0c;依赖…

整理了几道前端面试题

1. 若是有两个数组ar1和ar2&#xff0c;求它们的并集和交集&#xff0c;要怎么做&#xff1f; const ar1 [1, 2, 3, 4]; const ar2 [3, 4, 5, 6];一、求并集 (Union) 目标&#xff1a; 把两个数组合并成一个新数组&#xff0c;新数组包含所有出现过的元素&#xff0c;但每个…

Mac M4环境下基于VMware Fusion虚拟机安装Ubuntu24.04 LTS ARM版

Mac M4环境下基于VMware Fusion虚拟机安装Ubuntu24.04 LTS ARM版 1 下载Ubuntu镜像 在Ubuntu官网下载Ubuntu24.04 LTS的arm版镜像&#xff0c;这里选择ubuntu-24.04-live-server-arm64.iso&#xff0c;支持arm的似乎没有合适的desktop版本&#xff0c;Server版本默认是不带图…

开源与定制化对比:哪种在线教育系统源码更适合教育培训APP开发?

如今&#xff0c;“在线教育系统源码”已经成为许多教育培训机构、创业者甚至传统学校的高频关键词。无论是打造一款在线教育APP&#xff0c;还是开发企业内部培训平台&#xff0c;源码选择都决定了后续的开发效率、产品体验与商业化潜力。 在实际开发中&#xff0c;常见的源码…

中间件的日志分析

将日志文件access.log复制到kali中进行分析使用命令查看文件中各IP的访问次数&#xff0c;依次分析其行为awk { print $1 } access.log | sort | uniq -c |sort -nr172.16.3.189cat access.log | grep 172.16.3.198行为模式分析使用固定弱密码进行身份验证 几乎所有请求都使用用…

【Big Data】云原生与AI时代的存储基石 Apache Ozone 的技术演进路径

目录 一、Apache Ozone是什么&#xff1f; 二、Ozone的诞生背景 三、Ozone的架构设计 1. 分层架构设计 2. Ozone Manager (OM) 3. Storage Container Manager (SCM) 4. DataNode 5. Raft协议应用 四、Ozone解决的关键问题 1. 元数据管理瓶颈 2. 小文件性能问题 3. …

抖音直播礼物弹幕抓取工具:技术实现与功能解析

基于Python的直播间数据采集技术实践一、项目概述基于Python开发的直播间数据采集方案&#xff0c;采用最新签名算法(dysign)实现稳定连接&#xff0c;实时获取直播间各类互动数据&#xff0c;为直播数据分析和互动应用开发提供技术支持。二、核心功能实时消息监控用户进入提醒…

添加地址页面,可以添加复制粘贴,自动识别地址的功能uniapp实现方式

主要用uni.getClipboardData(OBJECT)&#xff0c;更多信息可以到uniapp官网查看以下实现方式 1利用api, 2针对判断优化方案&#xff0c;在线APIhandleConfirm2(){let that this;promisRequest({url: https://wangzc.wang/smAddress,data: {"address": that.…