题解 | #火车进站#
火车进站
https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109
思路倒是很好想
两点细节:
(1)deque双端队列这是刷了200多道题以来第一次用,记录一下
(2)要求输出时按照字典序,所以我们把它放入set输出(一开始直接放也行,懒得改了)
#include <iostream>
#include <bits/stdc++.h>
#include <vector>
using namespace std;
vector<vector<int>>result;
void do_work(stack<int>&st,deque<int>&que,vector<int>&vec,int n);
int main() {
//第一反应是用一个队列和一个栈
int n,number;
deque<int>que;
while(cin>>n){
int size = n;
while(n--){
cin>>number;
que.push_back(number);
}
stack<int>st;
int num = que.front();
que.pop_front();
st.push(num);
//准备工作完成
vector<int>vec;
do_work(st,que,vec,size);
//打印结果
set<vector<int>>m_set(result.begin(),result.end());
for(auto &i:m_set){
for(int j = 0;j<size;j++){
cout<<i[j]<<" ";
}
cout<<endl;
}
}
}
void do_work(stack<int>&st,deque<int>&que,vector<int>&vec,int n){
if(vec.size()==n){
result.push_back(vec);
return;
}
//每轮做两件事,要么从栈里面弹一个到容器;要么把队列的头进栈
//栈里有值,弹出,回溯
if(!st.empty()){
int num = st.top();
st.pop();
vec.push_back(num);
do_work(st, que, vec,n);
vec.pop_back();
st.push(num);
}
//队列中有值,加入栈,回溯
if(!que.empty()){
int num = que.front();
que.pop_front();
st.push(num);
do_work(st, que, vec,n);
st.pop();
que.push_front(num);
}
}
// 64 位输出请用 printf("%lld")


