【华为机试题】【栈】【全排列】火车进站

链接:https://www.nowcoder.com/questionTerminal/97ba57c35e9f4749826dc3befaeae109
来源:牛客网

火车进站

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。

输入描述:

有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9

输出描述:

输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。

示例1

输入

3
1 2 3

输出

1 2 3
1 3 2
2 1 3
2 3 1
3 2 1

问题分析:

                    1.全排列

                    2.根据栈 后进先出的特点筛去 原始进站顺序无法出栈得到的排列

方法要点:

                    std::next_permutation() 排序函数的使用                  

default (1)
template <class BidirectionalIterator>
  bool next_permutation (BidirectionalIterator first,
                         BidirectionalIterator last);
custom (2)
template <class BidirectionalIterator, class Compare>
  bool next_permutation (BidirectionalIterator first,
                         BidirectionalIterator last, Compare comp);
#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;

//is_order函数用来判断当前排序即v1数组是否可以通过数组v压栈得出
bool is_order(vector<int> &v, vector<int> &v1, int n)
{
	if (v.size() == 0 || v1.size() == 0 || n <= 0)
		return false;
	stack<int> s;
	int j = 0;
	for (size_t i = 0; i < v.size(); i++)
	{
		s.push(v[i]);
		while (j < n && s.size() != 0 && v1[j] == s.top())
		{
			s.pop();
			j++;
		}
	}
	return s.empty();
}
int main()
{
	int n;
	while (cin >> n)
	{
		vector<int> v(n),v1(n);
		for (int i = 0; i < n;i++)
			cin >> v[i];
		//把输入的数据数组复制一份到v1
		v1.assign(v.begin(),v.end());
		//对v1进行排序 ----------由题目输出要以字典序排序输出可知
		sort(v1.begin(), v1.end());
		do
		{
			if (is_order(v, v1, n))
			{
				for (auto e : v1)
					cout << e << " ";
				cout << endl;
			}
		} while (next_permutation(v1.begin(), v1.end()));
	}
	return 0;
}

 

全部评论

相关推荐

点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务