文章标题

全排序的实现
引用:http://blog.csdn.net/morewindows/article/details/7370155/
递归实现:

#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<vector>
#include<stack>
#include<set>
#include<stdio.h>
using namespace std;
int cnt = 0;
void swap(char *c1, char *c2) {
    char t = *c1;
    *c1 = *c2;
    *c2 = t;
}
void AllRange(char s[], int k, int n) {
    if(k == n) {
        printf("%d: %s\n", ++cnt, s);
        return;
    }
    AllRange(s, k+1, n);
    set<char> st;
    st.insert(s[k]);
    for(int i = k + 1; i <= n; i++) {
        if(st.count(s[i])) continue;
        st.insert(s[i]);
        swap(s+k, s+i);
        AllRange(s, k+1, n);
        swap(s+k, s+i);
    }
}
int main() {
    char s[100];
    while(~scanf("%s", s)) {
        cnt = 0;
        AllRange(s, 0, strlen(s)-1);
    }
}

2.非递归实现

#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<vector>
#include<stack>
#include<set>
#include<stdio.h>
using namespace std;
void swap(char *c1, char *c2) {
    char t = *c1;
    *c1 = *c2;
    *c2 = t;
}
bool tnext_permutation(char c[]) {
    int n = strlen(c);
    if(n == 0) return false;
    for(int i = n - 2; i >= 0; i--) {
        if(c[i] < c[i+1]) {
            int k = i + 1;
            for(int j = i + 2; j < n; j++) {
                if(c[j] < c[k] && c[j] > c[i]) {
                    k = j;
                }
            }
            swap(c+i, c+k);
            sort(c+i+1, c+n);
            return true;
        }
    }
    sort(c, c+n);
    return false;
}
int main() {
    char s[100];
    while(~scanf("%s", s)) {
        int cnt = 0;
        int n = strlen(s);
        sort(s, s+n);
        do{
            cout<<++cnt<<": "<<s<<endl;
        }while(tnext_permutation(s));
    }
}

c++头文件中包含了全排序函数
next_permutation(a,a+3)
与prev_permutation(a, a+3)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值