全排列

Time limit:1000 ms Memory limit:131072 kB

Problem Description

给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = “1312”, 
输出为: 
1123 
1132 
1213 
1231 
1312 
1321 
2113 
2131 
2311 
3112 
3121 
3211

Input

输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字)

Output

输出S所包含的字符组成的所有排列

Sample Input

1312

Sample Output

1123 
1132 
1213 
1231 
1312 
1321 
2113 
2131 
2311 
3112 
3121 
3211

主要就是学会搜索,这个就是利用搜索解决的。具体见代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int vis[15], len;
char a[15], b[15];
void dfs(int l) {
    if (!(len - l)) {
        for (int i = 0; i < l; i++)
            printf("%c", b[i]);
        printf("\n");
        return ;
    }
    for (int i = 0; i < len; i++) {
        if (!(vis[i] || (i > 0 && vis[i - 1] == 0 && a[i] == a[i - 1]))) {
            vis[i] = 1;
            b[l] = a[i];
            dfs(l + 1);
            vis[i] = 0;
        }
    }
}
int main() {
    scanf("%s", a);
    len = strlen(a);
    sort(a, a + len);
    dfs(0);
    return 0;
}