关于各种排列(dfs)
代码一:数字有重复:
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 }
答案:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
代码二:含数组排列,数字无重复:
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 }
答案:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
全排列:南阳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 }
答案:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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