51Nod 1384 全排列

给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = "1312",
输出为:

1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211
Input
输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字)
Output
输出S所包含的字符组成的所有排列
Input示例
1312
Output示例
1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211


思路:dfs+set去重

#include <bits/stdc++.h>
#define rep(i,a,n) for (int i=a;i<n;i++)
#define sz(x) ((int)(x).size())
using namespace std;

string s;
int a[15];
int b[15];
int v[15]={0};
int len;
set<string> iset;
void dfs(int m){
    if(m == len + 1) {
        string s1;
        rep(i, 1, len + 1) {
            s1 += a[b[i]] + '0';
        }
        iset.insert(s1);
        return ;
    }
    for(int i = 1; i <= len; i++) {
        if(v[i] == 0) {
            b[m] = i;
            v[i] = 1;
            dfs(m + 1);
            v[i] = 0;
        }
    }
}
int main()
{
    cin >> s;
    len = sz(s);
    rep(i, 0, len){
    a[i+1] = s[i] - '0';
    }
    sort(a+1, a+1+len);
    dfs(1);
    set<string>::iterator it;
    for(it = iset.begin(); it != iset.end(); ++it) {
        cout<< *it <<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值