栈实现指数型枚举
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
题目描述
从 1∼n这 n (n≤16) 个整数中随机选取任意多个,输出所有可能的选择方案。
输入描述:
一个整数n。
输出描述:
每行一种方案。同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
示例1
输入
3
输出
3
2
2 3
1
1 3
1 2
1 2 3
利用栈与队列的特点与数的顺序进行枚举
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;
stack<ll>sum1;
queue<ll>sum2;
void process(int num)
{
for (int i = 1; i <= num; i++)
sum1.push(i);//升序入栈
while (!sum1.empty())
{
ll temp1 = sum1.top();
sum1.pop();//出栈
bool f = 1;
for(int i=0;i<sum2.size();i++)//检验是否可以升序插入,如果不可以将第一个比当前出栈的数大的前面所有数放到后面
if (sum2.front()<temp1)
{
sum2.push(sum2.front());
sum2.pop();
}
else
{
f = 0;
break;
}
if (sum2.empty() || f)//如果可添加到队列
{
sum2.push(temp1);
queue<ll>temp2;
while (!sum2.empty())
{
temp2.push(sum2.front());
sum2.pop();
}
while (!temp2.empty())
{
sum2.push(temp2.front());
cout << temp2.front() << ' ';
temp2.pop();
}
cout << endl;
}
else {//如果不可添加到队列,则入栈
sum1.push(sum2.front());
sum1.push(temp1);
sum2.pop();
}
}
}
int main()
{
int n;
cin >> n;
process(n);
cout << endl;//打印什么都不选的情况
return 0;
}
京公网安备 11010502036488号