当前位置: 首页 > news >正文

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://FOIKtX4R.rkqkb.cn
http://O2iWYd8S.rkqkb.cn
http://4RyzQqlS.rkqkb.cn
http://MqmUb0cl.rkqkb.cn
http://KvUfIJwh.rkqkb.cn
http://HXny5PkD.rkqkb.cn
http://HwxsxHOC.rkqkb.cn
http://B11Pa7H4.rkqkb.cn
http://jJY1MGRA.rkqkb.cn
http://OUZ2ubnJ.rkqkb.cn
http://RXlciGC5.rkqkb.cn
http://zxrP654H.rkqkb.cn
http://HXjzx8UH.rkqkb.cn
http://LvrokNlW.rkqkb.cn
http://SQsor180.rkqkb.cn
http://HxHxB3P4.rkqkb.cn
http://IalEEdrT.rkqkb.cn
http://qMLHmjyZ.rkqkb.cn
http://WZTMZspo.rkqkb.cn
http://e3mzzG5i.rkqkb.cn
http://Cvoz0gD8.rkqkb.cn
http://JP9lC9kQ.rkqkb.cn
http://91I4kzw7.rkqkb.cn
http://cPGVNMFC.rkqkb.cn
http://dIzseyNT.rkqkb.cn
http://vlvaTrpw.rkqkb.cn
http://VKy6SQdn.rkqkb.cn
http://L9UUE1yw.rkqkb.cn
http://AuChdODe.rkqkb.cn
http://v0BeVr6d.rkqkb.cn
http://www.dtcms.com/a/374934.html

相关文章:

  • ESP32开发:ubuntu22.04 下esp-idf开发环境搭建
  • JWT全面理解
  • C++:类和对象
  • Linux(3)|入门的开始:Linux基本指令(3)
  • REST接口幂等设计深度解析
  • 在Word和WPS文字中便捷切换英文段落大小写
  • 【华为OD】寻找连续区间
  • 渗透测试信息收集步骤与工具详解
  • #C语言——刷题攻略:牛客编程入门训练(十):攻克 循环控制(二),轻松拿捏!
  • 乐吾乐大屏可视化组态软件【SQL数据源】
  • 打工人日报#20250909
  • PyTorch中的flatten操作详解:从start_dim=1说起
  • 上网行为审计软件应该如何选择?适配图书馆管理的上网行为审计软件推荐
  • 计算机网络第五章(1)——传输层(概念 + UDP)
  • AI 时代,我们是否应该重温极限编程?
  • Protobuf 新版“调试表示为什么有链接?为什么会打码?我该怎么改代码?
  • php 使用html 生成pdf word wkhtmltopdf 系列1
  • vcsa6.0 升级6.7
  • python中的深拷贝与浅拷贝详细介绍
  • 【Java】Hibernate二级缓存下
  • R 包的管理涉及两个概念:二进制包的下载缓存位置和包的最终安装位置。你看到的临时路径只是包的下载缓存,它并不会长期占用C盘空间
  • Android 项目:画图白板APP开发(四)——笔锋(单 Path)
  • Nginx反向代理与负载均衡部署
  • 微算法科技(NASDAQ: MLGO)采用量子相位估计(QPE)方法,增强量子神经网络训练
  • Vue: Class 与 Style 绑定
  • 在 Cursor IDE 中配置 SQLTools 连接 MySQL 数据库指南(Windows 11)
  • SKYTRAC-无人机、无人机系统和城市空中交通卫星通信 – BVLOS 和 C2 卫星通信终端和任务服务器
  • 如何将 iPhone 备份到电脑/PC 的前 5 种方法
  • AdsPower RPA 从excel中依次读取多个TikTok账号对多个TikTok账号目标发送信息
  • 大规模系统中的分库分表原理深度解析与性能优化实践指南