题解 | #火车进站#

火车进站

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;
        }
        
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 17:58
点赞 评论 收藏
分享
看到这个内容真是闹麻了。。。。。。现在有了AI以后很多人面试都会作弊吗?&nbsp;那对老老实实面试的人岂不是不公平....
重生之我要干前端:放宽心,作弊很明显的,面试官也不是傻子,而且这世上更多的肯定是依靠自己的知识的人,所以放宽心提升自己最重要
点赞 评论 收藏
分享
05-29 22:11
门头沟学院 Java
Elastic90:抛开学历造假不谈,这公司的招聘需求也挺怪的,Java开发还要求你有图文识别、移动端开发和c++的经验,有点逆天了。
点赞 评论 收藏
分享
06-02 15:53
阳光学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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