全排列

匿名 (未验证) 提交于 2019-12-03 00:38:01

全排列

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; }
转载请标明出处:全排列
文章来源: 全排列
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!