栈实现指数型枚举

时间限制: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;
}