题解 | #火车进站#

火车进站

http://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109

这道题的dfs比较难理解,我认为主要困难的地方在于,进站的时候也要回溯这里,,每次进行dfs之后一定要回到原来的状态。最后用的set来排序。

#include <algorithm>
#include <vector>
#include <stack>
#include <set>

using namespace std;

void dfs(vector<int> &intrain,stack<int>&s,vector<int> output,set<vector<int>> &st,int index){
    if(output.size()==intrain.size()){
        st.insert(output);
        return ;
    }
    for(int i = 0;i<2;i++){
        if(i==0&&!s.empty()){//这里出栈
            int temp = s.top();
            s.pop();
            output.push_back(temp);
            dfs(intrain,s,output,st,index);//dfs后一定要回到原来的状态,
            //像什么都没发生一样,这里理解就想像dfs已经把你要的序列保存起来了。
            output.pop_back();//现在回到原来的状态,准备下一个的进栈
            s.push(temp);
        }
        if(i==1&&(index!=intrain.size()-1)){//这里有的题解的index
        //代表即将要加入的列车序号我这里的代表已经加入到栈的序号。所以
        //当index==intrain.size()-1的时候说明最后一个已经入栈。跳过这里
            index++;
            int temp = intrain[index];
            s.push(temp);
            dfs(intrain,s,output,st,index);
            s.pop();
            index--;
            
            
        }
        
        
    }
    return;//这里要return,就是前面那些不满足条件的返回
    
    
    
    
    
}

int main() {
    int  N;
    while(cin>>N){
      vector<int> intrain;
        for(int i = 0;i<N;i++){
            int temp;
            cin>>temp;
            intrain.push_back(temp);
        }
        set<vector<int>> st;//最后需要字典序
        stack<int> s;//火车的入栈
        s.push(intrain[0]);//默认先把第一辆火车入栈,不然空的是没法输出的。
        int index = 0;//这里就是默认第一个已经进栈
        vector<int> output;//每一个序列的输出
        dfs(intrain,s,output,st,0);
        for(auto it = st.begin();it!=st.end();it++){
            for(int i = 0;i<intrain.size();i++){
                cout<<(*it)[i]<<' ';
                
            }
            cout<<endl;
        }
        
    }
}

全部评论

相关推荐

10-31 21:01
武汉大学 Java
lulululula...:仅仅按我个人的经历来看,大厂其实很少特别关注微服务,一般对微服务架构,限流熔断降级的概念了解就行,简历不写也不容易被问到。现在这个势头不如站点agent应用,比如做做mcp,rag,r对话agent,记忆管理之类的,说不定可以蹭上一波热度,进公司虽然可能还是干agent的杂活,但是可以学一学组内的业务和技术了
点赞 评论 收藏
分享
牛客41406533...:回答他在课上学,一辈子待在学校的老教授用三十年前的祖传PPT一字一句的讲解,使用谭浩强红皮书作为教材在devc++里面敲出a+++++a的瞬间爆出114514个编译错误来学这样才显得专业
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务