深度遍历,模拟出栈入栈
火车进站
http://www.nowcoder.com/questionTerminal/97ba57c35e9f4749826dc3befaeae109
深度遍历,模拟出栈入栈
递归时分三种情况:
1.进站不出
2.进站之后马上出站
3.栈里的车出来
当全部火车出站,算一种结果,最后用set去重排序。。。
运行时间45ms,好像要优于全排列的方法
#include <bits/stdc++.h>
using namespace std;
void dfs(set<vector<int>> &st, vector<int> &nums, stack<int> &s, vector<int>& q, int k)
{
//车全部出站,返回
if(q.size()==nums.size())
{
st.insert(q);
return;
}
for(int i=0; i<3; i++)
{
//有三种情况
//进站,马上出站
if(k<nums.size() && i==0)
{
q.push_back(nums[k++]);
dfs(st, nums, s, q, k);
q.pop_back();
k--;
}
//进站之后不出站
else if(k<nums.size() && i==1)
{
s.push(nums[k++]);//从待入站的车中取出一辆入站
dfs(st, nums, s, q, k);
s.pop();
k--;
}
//车从站里出来
else if(i==2 && !s.empty())
{
q.push_back(s.top());
s.pop();
dfs(st, nums, s, q, k);
s.push(q[q.size()-1]);
q.pop_back();
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(cin>>n)
{
vector<int> nums(n);//待入栈的车
for(int i=0; i<n; i++)
cin>>nums[i];
stack<int> s;//站内的车
vector<int> q;//已经出站的车
set<vector<int>> st;
dfs(st, nums, s, q, 0);
for(auto iter=st.begin(); iter!=st.end(); ++iter)
{
for(int i=0; i<n; i++)
{
cout<<(*iter)[i]<<" ";
}
cout<<endl;
}
}
}