【问题标题】:Is there any algorithm for permutations?是否有任何排列算法?
【发布时间】:2012-07-20 19:30:17
【问题描述】:

我需要一种算法或伪代码来生成排列。假设,我得到了两个数字,分别表示字母的数量和排列的数量。

我必须写出 26 个英文字母的所有排列。我已经写了一个代码,但是有一个问题。问题在于输入 3 和 6,我的代码生成 ABC、ACB、BAC、BCA、CBA、CAB。但我需要它来生成 ABC、ACB、BAC、BCA、CAB、CBA

#include<iostream>

using namespace std;

int c, K, N;

void permute(char a[], int i);
void swap(char* x, char* y);

int main(void)
{
    int t;
    char a[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    cin >> t;
    for(int i=1; i<=t; i++)
    {
        cin >> N >> K;//N denotes number of letters and K denotes number of permutations
        cout << "Case " << i <<":" << endl;
        c=0;
        permute(a,0);
    }
    return 0;
}

void permute(char* a, int i)
{ 
    if(i==N-1)
    {
        for(int j=0; j<N; j++)
            cout << a[j];
        cout << endl;
        c++;
        return;
    }
    else
    {
        for(int j=i; j<N && c<K; j++)
        {
            swap(&a[i],&a[j]);
            permute(a,i+1);
            swap(&a[i],&a[j]);
        }
    }
    return;
}

void swap(char* x, char* y)
{
    char temp;
    temp=*x;
    *x=*y;
    *y=temp;
    return;
}

【问题讨论】:

  • 结果的顺序重要吗?
  • 是的,顺序很重要。

标签: c++ algorithm permutation


【解决方案1】:

std::next_permutation函数

【讨论】:

    【解决方案2】:

    你可以试试这个。我使用c编程。您可以轻松地将此代码转换为 c++。我的代码是::

     #include<stdio.h>
     #include<stdlib.h>
     #include<ctype.h>
    
     int com(const void *a,const void *b)   {
        char c,d;
        c=*((char *)a);
        d=*((char *)b);
    return (c-d);
     }
    
    int main()   {
       char a[600];
       int i,j,l,flag=0,count=0,cs,c;
       scanf("%d",&cs);
       getchar();
    
       for(;cs;cs--)  {
        gets(a);
        for(l=0;a[l];l++);
        qsort(a,l,sizeof(char),com);
        puts(a);
        if(a[0]==0)
            break;
        while(1) {
            for(i=l-1;a[i]>=a[i+1]&&i;i--);
            if(a[i]>=a[i+1])
                break;
            for(j=l-1;a[i]>=a[j];j--);
            c=a[i];
            a[i]=a[j];
            a[j]=c;
            for(j=i+1,i=l-1;i>j;i--,j++)
            {
                c=a[i];
                a[i]=a[j];
                a[j]=c;
            }
            puts(a);
          }
       }
       return 0;
     }
    

    【讨论】:

      【解决方案3】:
      #include <algorithm>
      #include <iostream>
      #include <ostream>
      #include <vector>
      #include <iterator>
      
      using namespace std;
      
      void print(vector<char> &v){
          copy(v.begin(), v.end(), ostream_iterator<char>(cout));
          cout << endl;
      }
      
      void permute(vector<char> &v, int k){
          int c=0;
          do {
              print(v);
              ++c;
          }while(c < k && next_permutation(v.begin(), v.end()));
      }
      
      int main(){
          char a[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
          int t;
      
          cout << "Input number of trials:";
          cin >> t;
          for(int i=1; i<=t; ++i){
              int n, k;
              cout << "letter length:";
              cin >> n;
              cout << "permutation length:";
              cin >> k;
              vector<char> v(&a[0], &a[n]);
              cout << "Case " << i <<":" << endl;
              permute(v, k);
          }
      }
      

      【讨论】:

      • 非常感谢。感谢你的帮助。我终于解决了问题
      【解决方案4】:
      #include <algorithm>
      #include <iostream>
      #include <ostream>
      #include <vector>
      #include <iterator>
      
      using namespace std;
      
      vector<int> n2pat(int n, int len){
          vector<int> v;
      
          for(int i=1;i<=len;++i){
              v.push_back(n % i);
              n /= i;
          }
          reverse(v.begin(), v.end());
          return v;
      }
      
      template<typename T>
      vector<T> pat2perm(vector<T> v, vector<int> &pat){
          vector<T> perm;
          for(vector<int>::const_iterator i=pat.begin();i!=pat.end();++i){
              perm.push_back(v[*i]);
              v.erase(v.begin()+ *i);
          }
          return perm;
      }
      
      template<typename T>
      void print(vector<T> &v){
          copy(v.begin(), v.end(), ostream_iterator<T>(cout));
          cout << endl;
      }
      
      template<typename T>
      void permute(vector<T> &v, int k){
          int size=v.size();
          for(int c=0;c<k;++c){
              vector<int> pat = n2pat(c, size);
              vector<T> perm = pat2perm(v, pat);
              print<T>(perm);
          }
      }
      
      int main(){
          char a[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
          int t;
      
          cout << "Input number of trials:";
          cin >> t;
          for(int i=1; i<=t; ++i){
              int n, k;
              cout << "letter length:";
              cin >> n;
              cout << "permutation length:";
              cin >> k;
              vector<char> v(&a[0], &a[n]);
              cout << "Case " << i <<":" << endl;
              permute(v, k);
          }
      }
      

      【讨论】:

      • 您能否在此处为您的两个示例添加一些介绍性材料?目前尚不清楚它们实际上显示的是什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 2019-07-28
      • 1970-01-01
      • 2011-03-21
      • 2014-02-12
      • 2011-06-07
      • 2020-03-11
      相关资源
      最近更新 更多