zoukankan      html  css  js  c++  java
  • dfs--全排列

    输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

    输入格式

    n(1≤n≤9)

    输出格式

    由1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个场宽

    我们要把1到n个数字任意组合,且组合不重复,按照从小到大排序

    vis数组:表示这个数字是否用到过

    每次判断数字是否之前便使用过,如果没有使用过,即选择这个数字 vis[]=1,继续dfs,在dfs之后,把这个数字重新还原以便下次使用

    1  for (int i = 1;i <= n;i++)
    2     {
    3         if (vis[i]==0)
    4         {
    5         vis[i] = 1;
    6         a[x] = i;
    7         dfs(x+1);
    8         vis[i] = 0;
    9     }

    当重复过n次后,及证明每个数字都已经被选择,我们就从头输出

    //给有一个整数n,1~n个数全排列 
    #include <iostream>
    #include <cstdio>
    using namespace std;
    bool vis[100];
    int a[100];
    int n;
    void dfs(int x)
    {
        if (x == n+1)
        {
            for (int i = 1;i <= n;i++)
            {
                    printf ("%5d",a[i]);
            }
            cout<<endl;
            return;
        }
        for (int i = 1;i <= n;i++)
        {
            if (vis[i]==0)
            {
            vis[i] = 1;
            a[x] = i;
            dfs(x+1);
            vis[i] = 0;
        }
    }
    }
    int main()
    {
        scanf ("%d",&n); 
        dfs(1);
        return 0;
    }

     还有一些板子题也就一起放上来了

     1 //n个数是否能选出一些数使他们的和为k
     2 #include <cstdio>
     3 #include <iostream>
     4 #include <cstring>
     5 using namespace std;
     6 int n,k,a[100];
     7 bool vis[100],flag=0;
     8 void dfs(int x)
     9 {
    10     if (x==n+1)
    11     {
    12         int ans = 0;
    13         for (int i = 1;i <= n;i++)
    14         {
    15             if (vis[i])
    16             {
    17                 ans+=a[i];
    18             }
    19         }
    20         if (ans==k)
    21         flag=1;
    22         return;
    23     }
    24     vis[x] = 1;
    25     dfs(x+1);
    26     vis[x] = 0;
    27     dfs(x+1);
    28 }
    29 int main()
    30 {
    31     scanf ("%d%d",&n,&k);
    32     for (int i = 1;i <= n;i++)
    33     scanf ("%d",&a[i]);
    34     dfs(1);
    35     if (flag)
    36     printf ("Yes");
    37     else 
    38     printf ("No");
    39     return 0;
    40  } 
    //在n个数里面任选k个 ,求所有情况乘积的和
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    int n,k,a[100];
    bool vis[100];
    int tmp = 0;
    void dfs(int x,int count)
    {
        if (count==k)
        {
            int ans = 1;
            for (int i = 1;i <= n;i++)
            {
                if (vis[i])
                {
                    ans*=a[i];
                }
            }
            tmp+=ans;
            return ;
        }
        if (x==n+1)
        return ;
        vis[x] = 1;
        dfs(x+1,count+1);
        vis[x] = 0;
        dfs(x+1,count);
    }
    int main()
    {
        scanf ("%d%d",&n,&k);
        for (int i = 1;i <= n;i++)
        {
            scanf ("%d",&a[i]);
        }
        dfs(1,0);
        cout<<tmp;
        return 0;
     } 
  • 相关阅读:
    Python for Infomatics 第14章 数据库和SQL应用四(译)
    展望2017
    bing的简单英文字典工具
    自我安慰
    Python for Infomatics 第14章 数据库和SQL应用三(译)
    Python for Infomatics 第14章 数据库和SQL应用二(译)
    Python for Infomatics 第14章 数据库和SQL应用一(译)
    希望父亲早日恢复
    Python for Infomatics 第13章 网页服务四(译)
    Python for Infomatics 第13章 网页服务三(译)
  • 原文地址:https://www.cnblogs.com/very-beginning/p/11743184.html
Copyright © 2011-2022 走看看