ACM 编码与下一个排列

来源:互联网 发布:怎么加入淘宝联盟 编辑:程序博客网 时间:2024/05/20 05:53

STL中的next_permutation的实现原理

从右到左扫描找到第一个Ai<Ai+1

交换Ai,Ai+1,然后排序Ai+1到An


#include <iostream>#include <algorithm>using namespace std;string Next_Permutation(string str){    string strb;    int i;    bool ok=false;    strb=str;    int len=str.length();    for(i=len-2;i>=0;i--)    {        if(str[i]<str[i+1]){ok=true;break;}    }    if(!ok) return strb;    swap(strb[i],strb[i+1]);    sort(&strb[i+1],&strb[strb.length()-1]);    return strb;}int main(){    cout<<Next_Permutation(string("321"));    return 0;}



求某一个排列的编码

求和(Ai-Bi)*(n-i)!

Bi为Ai左边比Ai小的数的个数


#include <iostream>using namespace std;int Fact[9];int Code(string str){    int code;    int len=str.length();    int *pcnt=new int[len];    for(int i=0;i<len;i++)    {        pcnt[i]=0;        for(int j=0;j<i;j++)        {            if(str[j]<str[i]) pcnt[i]++;        }    }    code=0;    for(int i=1;i<=len;i++)    {        code+=(str[i-1]-'1'-pcnt[i-1]-1)*Fact[len-i];    }    delete pcnt;    return code;}int main(){    //¼ÆËã½×³Ë    Fact[0]=1;    for(int i=1;i<=8;i++) Fact[i]=i*Fact[i-1];    cout<<Code("231");    return 0;}


0 0
原创粉丝点击