题目链接:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=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
/*********************************************************
> File Name: 1384_全排列.cpp
> Author: dulun
> Mail: dulun@xiyoulinux.org
> Created Time: 2016年03月04日 星期五 15时41分59秒
*******************************************************/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#define LL long long
using namespace std;
const int N = 50;
char ans[N];
char s[N];
bool v[N];
int n;
void dfs(int cnt)
{
if(cnt == n)
{
cout<<ans<<endl;
return;
}
for(int i = 0; i < n; i++)
{
if(!v[i])
{
v[i] = 1;
ans[cnt] = s[i];
dfs(cnt+1);
v[i] = 0;
while( i<n && s[i] == s[i+1] ) i++;
}
}
}
int main()
{
cin>>s;
n = strlen(s);
sort(s, s+n);
dfs(0);
return 0;
}