zoukankan      html  css  js  c++  java
  • 关于各种排列(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("
    ");
     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
  • 相关阅读:
    CSS 3中细线边框如何实现?
    【SPL标准库专题(1)】 SPL简介
    【PSR规范专题(5)】PSR-4 改进后的自动加载规范
    【PSR规范专题(4)】PSR-3 日志接口规范
    【PSR规范专题(3)】PSR-2 代码风格规范
    【PSR规范专题(2)】PSR-1 基本代码规范
    YII框架的依赖注入容器与服务定位器简述
    PHP 反射机制Reflection
    【Apache运维基础(5)】Apache的Rewrite攻略(2)
    【Apache运维基础(4)】Apache的Rewrite攻略(1)
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4700513.html
Copyright © 2011-2022 走看看