码迷,mamicode.com
首页 > 其他好文 > 详细

关于各种排列(dfs)

时间:2015-08-03 22:24:30      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

代码一:数字有重复:

 1 #include <cstdio>
 2 int n,m,a[10],arr[10]={3,4,5,6};
 3 void dfs(int v){
 4     if(v >= n){
 5         for(int i = 0;i<n;i++)
 6             printf("%d ",a[i]);
 7         printf("\n");
 8         return ;
 9     }
10     for(int i = 0; i<m;i++){
11         a[v] = arr[i];
12         dfs(v+1);
13     }
14 }
15 int main(){
16     while(scanf("%d%d",&n,&m)==2){
17         dfs(0);
18     }
19 }

答案:

技术分享
  1 4 4
  2 3 3 3 3
  3 3 3 3 4
  4 3 3 3 5
  5 3 3 3 6
  6 3 3 4 3
  7 3 3 4 4
  8 3 3 4 5
  9 3 3 4 6
 10 3 3 5 3
 11 3 3 5 4
 12 3 3 5 5
 13 3 3 5 6
 14 3 3 6 3
 15 3 3 6 4
 16 3 3 6 5
 17 3 3 6 6
 18 3 4 3 3
 19 3 4 3 4
 20 3 4 3 5
 21 3 4 3 6
 22 3 4 4 3
 23 3 4 4 4
 24 3 4 4 5
 25 3 4 4 6
 26 3 4 5 3
 27 3 4 5 4
 28 3 4 5 5
 29 3 4 5 6
 30 3 4 6 3
 31 3 4 6 4
 32 3 4 6 5
 33 3 4 6 6
 34 3 5 3 3
 35 3 5 3 4
 36 3 5 3 5
 37 3 5 3 6
 38 3 5 4 3
 39 3 5 4 4
 40 3 5 4 5
 41 3 5 4 6
 42 3 5 5 3
 43 3 5 5 4
 44 3 5 5 5
 45 3 5 5 6
 46 3 5 6 3
 47 3 5 6 4
 48 3 5 6 5
 49 3 5 6 6
 50 3 6 3 3
 51 3 6 3 4
 52 3 6 3 5
 53 3 6 3 6
 54 3 6 4 3
 55 3 6 4 4
 56 3 6 4 5
 57 3 6 4 6
 58 3 6 5 3
 59 3 6 5 4
 60 3 6 5 5
 61 3 6 5 6
 62 3 6 6 3
 63 3 6 6 4
 64 3 6 6 5
 65 3 6 6 6
 66 4 3 3 3
 67 4 3 3 4
 68 4 3 3 5
 69 4 3 3 6
 70 4 3 4 3
 71 4 3 4 4
 72 4 3 4 5
 73 4 3 4 6
 74 4 3 5 3
 75 4 3 5 4
 76 4 3 5 5
 77 4 3 5 6
 78 4 3 6 3
 79 4 3 6 4
 80 4 3 6 5
 81 4 3 6 6
 82 4 4 3 3
 83 4 4 3 4
 84 4 4 3 5
 85 4 4 3 6
 86 4 4 4 3
 87 4 4 4 4
 88 4 4 4 5
 89 4 4 4 6
 90 4 4 5 3
 91 4 4 5 4
 92 4 4 5 5
 93 4 4 5 6
 94 4 4 6 3
 95 4 4 6 4
 96 4 4 6 5
 97 4 4 6 6
 98 4 5 3 3
 99 4 5 3 4
100 4 5 3 5
101 4 5 3 6
102 4 5 4 3
103 4 5 4 4
104 4 5 4 5
105 4 5 4 6
106 4 5 5 3
107 4 5 5 4
108 4 5 5 5
109 4 5 5 6
110 4 5 6 3
111 4 5 6 4
112 4 5 6 5
113 4 5 6 6
114 4 6 3 3
115 4 6 3 4
116 4 6 3 5
117 4 6 3 6
118 4 6 4 3
119 4 6 4 4
120 4 6 4 5
121 4 6 4 6
122 4 6 5 3
123 4 6 5 4
124 4 6 5 5
125 4 6 5 6
126 4 6 6 3
127 4 6 6 4
128 4 6 6 5
129 4 6 6 6
130 5 3 3 3
131 5 3 3 4
132 5 3 3 5
133 5 3 3 6
134 5 3 4 3
135 5 3 4 4
136 5 3 4 5
137 5 3 4 6
138 5 3 5 3
139 5 3 5 4
140 5 3 5 5
141 5 3 5 6
142 5 3 6 3
143 5 3 6 4
144 5 3 6 5
145 5 3 6 6
146 5 4 3 3
147 5 4 3 4
148 5 4 3 5
149 5 4 3 6
150 5 4 4 3
151 5 4 4 4
152 5 4 4 5
153 5 4 4 6
154 5 4 5 3
155 5 4 5 4
156 5 4 5 5
157 5 4 5 6
158 5 4 6 3
159 5 4 6 4
160 5 4 6 5
161 5 4 6 6
162 5 5 3 3
163 5 5 3 4
164 5 5 3 5
165 5 5 3 6
166 5 5 4 3
167 5 5 4 4
168 5 5 4 5
169 5 5 4 6
170 5 5 5 3
171 5 5 5 4
172 5 5 5 5
173 5 5 5 6
174 5 5 6 3
175 5 5 6 4
176 5 5 6 5
177 5 5 6 6
178 5 6 3 3
179 5 6 3 4
180 5 6 3 5
181 5 6 3 6
182 5 6 4 3
183 5 6 4 4
184 5 6 4 5
185 5 6 4 6
186 5 6 5 3
187 5 6 5 4
188 5 6 5 5
189 5 6 5 6
190 5 6 6 3
191 5 6 6 4
192 5 6 6 5
193 5 6 6 6
194 6 3 3 3
195 6 3 3 4
196 6 3 3 5
197 6 3 3 6
198 6 3 4 3
199 6 3 4 4
200 6 3 4 5
201 6 3 4 6
202 6 3 5 3
203 6 3 5 4
204 6 3 5 5
205 6 3 5 6
206 6 3 6 3
207 6 3 6 4
208 6 3 6 5
209 6 3 6 6
210 6 4 3 3
211 6 4 3 4
212 6 4 3 5
213 6 4 3 6
214 6 4 4 3
215 6 4 4 4
216 6 4 4 5
217 6 4 4 6
218 6 4 5 3
219 6 4 5 4
220 6 4 5 5
221 6 4 5 6
222 6 4 6 3
223 6 4 6 4
224 6 4 6 5
225 6 4 6 6
226 6 5 3 3
227 6 5 3 4
228 6 5 3 5
229 6 5 3 6
230 6 5 4 3
231 6 5 4 4
232 6 5 4 5
233 6 5 4 6
234 6 5 5 3
235 6 5 5 4
236 6 5 5 5
237 6 5 5 6
238 6 5 6 3
239 6 5 6 4
240 6 5 6 5
241 6 5 6 6
242 6 6 3 3
243 6 6 3 4
244 6 6 3 5
245 6 6 3 6
246 6 6 4 3
247 6 6 4 4
248 6 6 4 5
249 6 6 4 6
250 6 6 5 3
251 6 6 5 4
252 6 6 5 5
253 6 6 5 6
254 6 6 6 3
255 6 6 6 4
256 6 6 6 5
257 6 6 6 6
View Code

代码二:含数组排列,数字无重复:

 1 #include<stdio.h>
 2 #include<string.h> 
 3 #include<algorithm>
 4 using namespace std;
 5 struct Node{
 6     int m[10];
 7 };
 8 int cmp(Node a,Node b){
 9     for(int i=0;a.m[i];i++){
10             if(a.m[i]==b.m[i])continue;
11             if(a.m[i]<b.m[i])return 1;
12             else return 0;
13     }
14 }
15 int mark[1010],num[1010],t;
16 Node pt[1010];
17 int n;
18 void dfs(int k){
19     if(k>=n){
20         for(int i=0;i<k;i++)pt[t].m[i]=num[i];
21         t++;
22         return ;
23     }
24     for(int i=1;i<=n;i++){
25         if(!mark[i]){mark[i]=1;
26             num[k]=i;
27             dfs(k+1);
28             mark[i]=0;
29         }
30     }
31 }
32 int main(){
33     while(~scanf("%d",&n)){t=0;
34         memset(mark,0,sizeof(mark));
35         dfs(0);
36         sort(pt,pt+t,cmp);
37         for(int i=0;i<t;i++){
38             for(int j=0;j<n;j++)printf("%d ",pt[i].m[j]);
39             puts("");
40         }
41     }
42     return 0;
43 }

答案:

技术分享
  1 5
  2 1 2 3 4 5
  3 1 2 3 5 4
  4 1 2 4 3 5
  5 1 2 4 5 3
  6 1 2 5 3 4
  7 1 2 5 4 3
  8 1 3 2 4 5
  9 1 3 2 5 4
 10 1 3 4 2 5
 11 1 3 4 5 2
 12 1 3 5 2 4
 13 1 3 5 4 2
 14 1 4 2 3 5
 15 1 4 2 5 3
 16 1 4 3 2 5
 17 1 4 3 5 2
 18 1 4 5 2 3
 19 1 4 5 3 2
 20 1 5 2 3 4
 21 1 5 2 4 3
 22 1 5 3 2 4
 23 1 5 3 4 2
 24 1 5 4 2 3
 25 1 5 4 3 2
 26 2 1 3 4 5
 27 2 1 3 5 4
 28 2 1 4 3 5
 29 2 1 4 5 3
 30 2 1 5 3 4
 31 2 1 5 4 3
 32 2 3 1 4 5
 33 2 3 1 5 4
 34 2 3 4 1 5
 35 2 3 4 5 1
 36 2 3 5 1 4
 37 2 3 5 4 1
 38 2 4 1 3 5
 39 2 4 1 5 3
 40 2 4 3 1 5
 41 2 4 3 5 1
 42 2 4 5 1 3
 43 2 4 5 3 1
 44 2 5 1 3 4
 45 2 5 1 4 3
 46 2 5 3 1 4
 47 2 5 3 4 1
 48 2 5 4 1 3
 49 2 5 4 3 1
 50 3 1 2 4 5
 51 3 1 2 5 4
 52 3 1 4 2 5
 53 3 1 4 5 2
 54 3 1 5 2 4
 55 3 1 5 4 2
 56 3 2 1 4 5
 57 3 2 1 5 4
 58 3 2 4 1 5
 59 3 2 4 5 1
 60 3 2 5 1 4
 61 3 2 5 4 1
 62 3 4 1 2 5
 63 3 4 1 5 2
 64 3 4 2 1 5
 65 3 4 2 5 1
 66 3 4 5 1 2
 67 3 4 5 2 1
 68 3 5 1 2 4
 69 3 5 1 4 2
 70 3 5 2 1 4
 71 3 5 2 4 1
 72 3 5 4 1 2
 73 3 5 4 2 1
 74 4 1 2 3 5
 75 4 1 2 5 3
 76 4 1 3 2 5
 77 4 1 3 5 2
 78 4 1 5 2 3
 79 4 1 5 3 2
 80 4 2 1 3 5
 81 4 2 1 5 3
 82 4 2 3 1 5
 83 4 2 3 5 1
 84 4 2 5 1 3
 85 4 2 5 3 1
 86 4 3 1 2 5
 87 4 3 1 5 2
 88 4 3 2 1 5
 89 4 3 2 5 1
 90 4 3 5 1 2
 91 4 3 5 2 1
 92 4 5 1 2 3
 93 4 5 1 3 2
 94 4 5 2 1 3
 95 4 5 2 3 1
 96 4 5 3 1 2
 97 4 5 3 2 1
 98 5 1 2 3 4
 99 5 1 2 4 3
100 5 1 3 2 4
101 5 1 3 4 2
102 5 1 4 2 3
103 5 1 4 3 2
104 5 2 1 3 4
105 5 2 1 4 3
106 5 2 3 1 4
107 5 2 3 4 1
108 5 2 4 1 3
109 5 2 4 3 1
110 5 3 1 2 4
111 5 3 1 4 2
112 5 3 2 1 4
113 5 3 2 4 1
114 5 3 4 1 2
115 5 3 4 2 1
116 5 4 1 2 3
117 5 4 1 3 2
118 5 4 2 1 3
119 5 4 2 3 1
120 5 4 3 1 2
121 5 4 3 2 1
View Code

全排列:南阳oj组合数:

 1 #include<stdio.h>
 2 int m[1010];
 3 int n,k;
 4 void dfs(int top,int flot){
 5     if(flot>=k){
 6         for(int i=0;i<flot;i++)printf("%d ",m[i]);
 7         puts("");return ;
 8     }
 9     for(int i=top;i>0;i--){
10         m[flot]=i;
11         dfs(i-1,flot+1);
12     }
13     return ;
14 }
15 int main(){
16     while(~scanf("%d%d",&n,&k)){
17         dfs(n,0);
18     }
19     return 0;
20 }

答案:

 

技术分享
 1 6 3
 2 6 5 4
 3 6 5 3
 4 6 5 2
 5 6 5 1
 6 6 4 3
 7 6 4 2
 8 6 4 1
 9 6 3 2
10 6 3 1
11 6 2 1
12 5 4 3
13 5 4 2
14 5 4 1
15 5 3 2
16 5 3 1
17 5 2 1
18 4 3 2
19 4 3 1
20 4 2 1
21 3 2 1
View Code

 

关于各种排列(dfs)

标签:

原文地址:http://www.cnblogs.com/handsomecui/p/4700513.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!