zoukankan      html  css  js  c++  java
  • dfs 生成排列和组合

    利用深度优先搜索的性质可以方便的生成n的排列和组合,但是生成组合时每个组合里面元素的个数必须事先确定,以前以为生成组合跟排列一样到n时就可以回溯,直到今天做了某题之后才发现那是错的,那样做生成不了所有的组合。

    生成排列(默认是全排列,也可以传个参数生成n的k排列)

     1 #include<cstdio>
     2 #define MAXN 111
     3 using namespace std;
     4 int tmp[MAXN],vis[MAXN],n,k;
     5 void dfs(int cnt,int num = n){
     6     if(num > n){
     7         printf("the input data is invalid !!!
    ");
     8         return;
     9     }
    10     if(cnt == num){
    11         for(int i = 0;i < cnt;i ++) printf("%d ",tmp[i]);
    12         printf("
    ");
    13     }
    14     for(int i = 1;i <= n;i ++){
    15         if(!vis[i]){
    16             vis[i] = 1;
    17             tmp[cnt] = i;
    18             dfs(cnt+1,num);
    19             vis[i] = 0;
    20         }
    21     }
    22 }
    23 int main(){
    24     while(~scanf("%d%d",&n,&k)) dfs(0,k);
    25     return 0;
    26 }

    生成组合

     1 #include<cstdio>
     2 #define MAXN 111
     3 using namespace std;
     4 int tmp[MAXN],n,k;
     5 void dfs(int idx,int cnt,int k){
     6     if(k > n){
     7         printf("the input data is invalid!!!
    ");
     8         return;
     9     }
    10     if(cnt == k){
    11         for(int i = 0;i < cnt;i ++) printf("%d ",tmp[i]);
    12         printf("
    ");
    13     }
    14     for(int i = idx;i <= n;i ++){
    15             tmp[cnt] = i;
    16             dfs(i+1,cnt+1,k);
    17     }
    18 }
    19 int main(){
    20     while(~scanf("%d%d",&n,&k)) dfs(1,0,k);
    21     return 0;
    22 }
  • 相关阅读:
    【转载wpf命令】
    【转载WPF资源】
    【转载MVVM模式的简介】
    【转载有关XmlAttribute的知识】
    【test7】stream、用于输入和输出的类、特性
    【补充作业】XML和LINQ
    CodeVS 1084 乒乓球
    android开发之屏幕旋转
    Android开发之新建项目报错的问题
    Android 开发获取用户权限
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3684967.html
Copyright © 2011-2022 走看看