zoukankan      html  css  js  c++  java
  • 一个简单的问题 -全排列

    全排列一共分为两种情况,有重复元素和无重复元素,大一开始做的时候不会写,现在特意写一下这个问题的各种解法。

    1.无重复元素,这种相对简单一些,用递归就可以了

      首先找到第一个字母,然后找到剩余的字母中的第一个字母,依次类推,很简单,代码如下:

    //本来准备用dfs写,发现两个的复杂度是一样的,就没有必要了。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;

    char str[10],ans[10];
    int n;

    void dfs(int cur)
    {
       if(cur==n)
       {
          for(int i=0;i<n;i++)
             putchar(ans[i]);
          putchar(' ');
       }
       else
       {
          for(int i=0;i<n;i++)
          {
             bool ok=1;
             for(int j=0;j<cur;j++)
                if(ans[j]==str[i])
                {
                   ok=0;
                   break;
                }
             if(ok)
             {
                ans[cur]=str[i];
                dfs(cur+1);
             }
          }
       }
    }

    int main()
    {
       while(~scanf("%s",str))
       {
          n=strlen(str);
          sort(str,str+n);
          dfs(0);
       }
       return 0;
    }

    2.现在介绍第二种,就是有重复元素的情况,例如abbc的排列

    先介绍一种简单的方法,stl中提供了一个全排列的函数,下面介绍一下,

    next_permutation是头文件algorithm中的一个函数,使用的时候必须引用这个头文件,下面是他的使用方法
    next_permutation(str+s,str+e);str是一个字符数组,str+n,表示数组需要排列开始的地方,str+e表示数组排列结束的地方,他的含义是这个序列内的字符按照字典序的大小产生下一个序列,代码如下:
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    
    int main()
    {
      char s[10],str[10];
      cin>>s;
      strcpy(str,s);
      int len=strlen(s);
      do{
          cout<<s<<endl;
      next_permutation(s,s+len);
      }while(strcmp(str,s));
      return 0;
    }

  • 相关阅读:
    类 7.2访问控制与封装 笔记
    第七章 类(class)7.1 笔记
    10.4.3反向迭代器Reverse_iterator笔记
    10.4再探迭代器笔记
    10.3.4参数绑定 bind
    10.3lambda表达式笔记
    第10章 10.1-10.3笔记
    关于按下ctrl+z后,之后的cin失效的问题
    构造和改变一个string的其他方法
    BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解
  • 原文地址:https://www.cnblogs.com/jihe/p/4766997.html
Copyright © 2011-2022 走看看