Bootstrap

一起备战蓝桥杯与CCF-CSP之大模拟路径解析

🤭博主写完了今天给自己规定要完成的作业,就继续开启了我们的刷题之路。

咱们之前已经完成了:
1.备战思路及大模拟模板生成系统
2.一起备战蓝桥杯与CCF-CSP之大模拟画图)

让咱们一步一个脚印,一起冲吧!
为了鼓励自己,鼓励大家,我们一次一个小鸡汤!

tips:由于博主也不厉害,所以可能之前写的博文中有bug或者有疑问,但是我解决了之后,都会将博文更新,并且进行相应说明,比如在(1)中,就对之前的bug进行了解决💕💕💕

我们要相信:世上无难事,只要肯登攀!


概览:
刷题体会
题目坑点&解题思路
正解与解决


好了,咱们正式进入主题。

请添加图片描述

先说今天刷题我领悟到的体会

  1. 当输入字符串有空格时,一定要用getline读入,并且用了getline如果之前有读入(也就是说有用cin),我们都需要用到getchar(),至于getchar()的作用,我们已经在(1)中进行了讲解,这里,就不再cv啦。
  2. 编写中,相关操作能抽象成函数就抽相成函数,因为这样真的可以避免很多麻烦处理,这个我们在后续的代码中,大家就可以体会到,当然抽像成函数,可能也会造成一定的麻烦,比如传值的时候,这个咱就是说大家自己斟酌吧
  3. auto是真好用,他就是一个关键字,作用是可以帮你自动判断赋值的对象是什么数据,从而给你定义变量相应的类型。大家不了解的话可以去了解了解呀
  4. 变量名取的一定要有意义,这也符合工程规范

今天刷的题目是:2016-04-03:路径解析

大家可以点击链接去官网,具体题目如下:
在这里插入图片描述
题目坑点:

  1. 会有空串输入,所以我们读入得用getline,cin是读不进去的(别问我我怎么知道的)
  2. 其次,个人感觉其实题意描述的并不是很清楚,比如当前路径会不会随着规范而变化,感觉从样列也看不出来

解决思路:

  1. 直接硬模
  2. 输入的数据有两类 1.绝对路径,前面是’/’ 2.相等路径,也就是以‘…‘,’.‘开头,所以我们对这两类进行分别处理即可。
    由于我们最重要的其实是处理字符‘/’,所以我们可以考虑将’/'去掉后,再进行操作。

上我的代码(没什么看头,大家可直接略过),用于反面教材:

#include<iostream>
#include<stack>
#include<string>
using namespace std;
int n;
stack<string>sta;
int main()
{
    int n;
    cin>>n;
    string s,temp1="";
    cin>>s;
    for(int i=0;i<s.size();)
    {
       if(s[i]=='/')
       {
           i++;
           while( i<s.size() && s[i]!='/' )
           {
               temp1+=s[i];
               i++;
           }
           sta.push(temp1);
           temp1="";
       }
    }
    while(n--)
    {
        string s1,temp="";
        cin>>s1;
        stack<string>st2;
        for(int i=0;i<s1.size();)
        {
            temp="";
            if(i+1<s1.size() && s1[i]=='.' &&s1[i+1]=='/')//处理./
            {
                i+=2;
            }
            else if(i+1<s1.size() && s1[i]=='.' && s1[i+1]=='.' )//处理../
            {
                i+=3;
                int j=i;
                 //cout<<s1[j]<<s1[j+1]<<endl;
                while(s1[j]!='/')
                {
                    temp+=s1[j++];
                    //cout<<temp<<endl;
                }
                while(!sta.empty() && sta.top()!=temp)
                {
                    sta.pop();
                }
                while(!sta.empty())
                {
                cout<<sta.top();
                sta.pop();
                cout<<"/";
                }
                i=j+1;
            }
            else if(s1[i]=='/')
            {
                cout<<'/';
                i++;
                while(s1[i]=='/')
                {
                    i++;
                }
            }
            else
            {
                 while(i<s1.size() && s1[i]!='/' )
                {
                    temp+=s1[i++];
                }
                cout<<temp;
                st2.push(temp);
                temp="";
            }
        }
        cout<<endl;
        sta=st2;
    }
    return 0;
}

没啥好说的,就是按照题目来,由臭又长不说,过了样例交了一发。
Acwing一个点没过,官网过30%。

在这里插入图片描述

在这里插入图片描述在这里插入图片描述看了看y总讲解,似懂非懂,但是给了我很多写代码的启发,浅写了一下代码是干嘛的:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

vector<string> get(string& str)//处理'/',直接将目录名称,文件名称,'.','..'夹存入vector,方便后续处理
{
    vector<string> res;
    for (int i = 0; i < str.size(); i ++ )
    {
        if (str[i] == '/') continue;
        int j = i + 1;
        while (j < str.size() && str[j] != '/') j ++ ;
        res.push_back(str.substr(i, j - i));
        i = j;
    }
    return res;
}

void walk(vector<string> cur, vector<string> path)
{
    for (auto p: path)
    {
        if (p == ".") continue;
        if (p == "..")
        {
            if (cur.size()) cur.pop_back();
        }
        else cur.push_back(p);
    }

    if (cur.empty())
    {
        puts("/");
        return;
    }
    for (auto p: cur)
        cout << "/" << p;
    cout << endl;
}

int main()
{
    int n;
    string str;
    cin >> n >> str;
    vector<string> cur = get(str), ap;

    getchar();
    while (n -- )
    {
        getline(cin, str);
        auto path = get(str);
        if (str.size() && str[0] == '/') walk(ap, path);//是绝对路径
        else walk(cur, path);//相对路径
    }

    return 0;
}

作者:yxc
链接:https://www.acwing.com/activity/content/code/content/875202/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

好了,对比了y总代码,我写的是真的lj😭😭😭,就当给大家反面教材了,以后的码风一定像y总靠拢。

请添加图片描述

一起加油!!!✌️✌️✌️

;