51Nod-1384 全排列 (DFS)

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
给出一个字符串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
题意:= =、全排列。
个人理解:先用flag[10]数组把0-9的数的个数存储一下。然后用DFS选择每个位子选什么数,记得需要回溯。
更多的解释都在下面代码中。非常好理解
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 int flag[10];
 6 int number1[15]; 
 7 void DFS(int number,int S)//(数组中有几个数,总共有几个数) 
 8 {
 9     for (int i=0;i<10;i++)
10     {
11         if(flag[i]>0)//表示有这个数
12         {
13             flag[i]--;//消耗这个数 
14             number1[number]=i;//把这个数放入数组
15             number++;//数组中有几个数
16             if(number==S)//数组中的数满了,表明已经选择完毕,则直接把数组中的数输出 
17             {
18                 for (int q=0;q<number;q++)
19                 {
20                     if(q!=number-1)
21                     printf("%d",number1[q]);
22                     else
23                     printf("%d\n",number1[q]);
24                 }
25              }
26             DFS(number,S);
27             number--;//回溯 
28             flag[i]++;//回溯 
29         }
30     }
31 }
32 int main()
33 {
34     char s[10];
35     scanf("%s",s);
36     memset(flag,0,sizeof(flag));
37     int len=strlen(s);
38     for (int i=0;i<len;i++)
39     flag[s[i]-'0']++;//存储0-9每个数的个数 
40     DFS(0,len);
41     return 0;
42 }

 




posted @ 2018-07-13 14:42  jealous-boy  阅读(165)  评论(0编辑  收藏  举报