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;
    }

  • 相关阅读:
    December 23rd 2016 Week 52nd Friday
    December 22nd 2016 Week 52nd Thursday
    December 21st 2016 Week 52nd Wednesday
    December 20th 2016 Week 52nd Tuesday
    December 19th 2016 Week 52nd Sunday
    December 18th 2016 Week 52nd Sunday
    uva294(唯一分解定理)
    uva11624Fire!(bfs)
    fzu2150Fire Game(双起点bfs)
    poj3276Face The Right Way
  • 原文地址:https://www.cnblogs.com/jihe/p/4766997.html
Copyright © 2011-2022 走看看