算法/C++ STL排列&手动可选择排列

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin >> s;
    sort(s.begin(), s.end());
    do {
        cout << s << endl;
    } while (next_permutation(s.begin(), s.end()));
    cout << endl;
    sort(s.begin(), s.end(),greater<char>());
    do {
        cout << s << endl;
    } while (prev_permutation(s.begin(), s.end()));
    return 0;
}

简单明了,全靠 next/prev_permutation 函数,这是一个非常好用的排序函数,但无法进行剪枝的操作,即在明知当前排列已经错误时无法停止,会导致超时。

这是就需要我们手写一个排列函数

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

vector<int> a={1,2,3,4,5,6,7,8,9,10};
bool vis[20];
int b[20];

void dfs(int s,int t,vector<int>&a2){
    if(s == t){
        for(int i = 0; i < t; ++i) cout << b[i] << " ";
        cout << endl;
        return;
    }
//剪枝操作
    for(int i = 0; i < t; i++){
        if(!vis[i]){
            vis[i] = true;
            b[s] = a2[i];
            dfs(s + 1,t,a2);
            vis[i] = false;
        }
    }
    return;
}
int main(){
    int start,end;
    cin>>start>>end;
     vector<int> a2(a.begin() + start - 1, a.begin() + end);
    dfs(0,end-start+1,a2);
    return 0;
}

这里没有具体的例子大致是满足一个具体的条件后return结束递归

相关推荐
Niuguangshuo2 小时前
论文解读:CTC,端到端序列识别的开山之作
算法·语音识别
讳疾忌医丶2 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
lsswear3 小时前
Python 并发 线程
开发语言·python
2401_868534783 小时前
OpenStack 架构全景:八个核心组件深度拆解
c++·需求分析
郑州光合科技余经理3 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
高亦真3 小时前
今天是学习嵌入式的第37天
linux·学习·算法
软件课代表CiCi3 小时前
运行库是什么?电脑缺运行库怎么办?c++运行库缺失修复全攻略
开发语言·c++·windows·电脑·dll修复·dll丢失·运行库
Ivanqhz3 小时前
MLIR OpBuilder
开发语言·python·mlir
蒸蒸yyyyzwd4 小时前
从面经中学到的三件事
c++·笔记
时时三省4 小时前
【时时三省】计算机c语言二级考试选择题重点
c++