- 回溯。 
 - base case 要结合 情况判断。 
 
 #include<bits/stdc++.h>
using namespace std;
//result:结果集,temp:临时出车路径,arr:入站序列,n:火车数 stack:火车站 i:出栈序列位置 j:入站序列位置
void DFS(vector<vector<int>>& res, vector<int> & temp, vector<int> arr, int n, stack<int>& station , int i, int j){
    //base case
    if(j==n&&i==n){//所有进站得和出站得可能性已经走完了
       res.push_back(temp);
       return;
    }
    //选择进站(入栈序列不为空):入栈序列不为空,就可以选择。选择之后递归,之后再撤销选择
    if(j!=n){
        station.push(arr[j]);
        DFS(res,temp,arr,n,station,i, j+1);
        station.pop();
    }
     //栈顶的元素出栈:也是可选的(栈不空就可以操作)
    if(!station.empty()){
        int x = station.top();//大回溯选择
        station.pop();
        //出站序列构建
        temp.push_back(x);//选择
        DFS(res,temp,arr,n,station, i+1, j);
        temp.pop_back();//小回溯复原
        //大回溯复原
        station.push(x);
    }
}
int main(){
    int n,a;
    while(cin>>n){
        vector<int> train;
        for(int i=0; i< n; i++){
            cin>>a;
            train.emplace_back(a);
        }
        vector<vector<int>> res;
        vector<int> path;
        stack<int> station;
        DFS(res,path,train,n,station,0,0);
        sort(res.begin(),res.end());
        //输出
        for(int i = 0; i < res.size();i++){
            for(int j =0; j< n;j++){
                if(j==n-1){
                    cout<<res[i][j]<<endl;
                }else{
                    cout<<res[i][j]<<" ";
                }
            }
        }
    }
    return 0;
}