- 回溯。
- 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; }