全排列

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

 

至于如何用代码实现, 我分了两种情况

1. 在这 n 个元素中不存在相同元素

2. 在这 n 个元素中存在相同元素

 

#include <iostream>    // 不含相同元素的全排列 
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
char str[10];

void solve(char *str_begin, char *str_end)
{
//    sort(str, str+strlen(str));
//    puts(str);
    if(*str_end == '\0')
    {
        puts(str_begin);
    }
    
    else{
        for(char *tstr = str_end; *tstr != '\0'; tstr++)
        {
                swap(*str_end, *tstr);
                solve(str_begin, str_end+1);
                swap(*str_end, *tstr);
        }
    }
}
/*
void Permutation(char* pStr, char* pBegin)
{
//    assert(pStr && pBegin);

    if(*pBegin == '\0')
        printf("%s\n",pStr);
    else
    {
        for(char* pCh = pBegin; *pCh != '\0'; pCh++)
        {
            swap(*pBegin,*pCh);
            Permutation(pStr, pBegin+1);
            swap(*pBegin,*pCh);
        }
    }
}
*/
int main()
{
    gets(str);
    solve(str, str);
    puts("");
//    Permutation(str, str);
    
    return 0;
}

 

下面是含有相同元素的全排列

#include <iostream>    // 含相同字符的字符串全排列
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;

char str1[10], str2[10];
int len;

void solve(char *d, char *s, int i)
{
    char t;
    for(int j = 0; j< len; j++)
    {
        if(j> 0 && s[j] == s[j-1])
            continue;
        else if(s[j] != '#'){
            d[i] = s[j];
            t = s[j];
            s[j] = '#';
            if(i == len-1){
                d[len] = '\0';
                puts(d);
            }
            else{
                solve(d, s, i+1);
            }
            s[j] = t;
        }
    }
}

int main()
{
    gets(str1);
    len = strlen(str1);
    sort(str1, str1+len);
//    puts(str1);
    solve(str2, str1, 0);

    return 0;
}

 

posted @ 2016-04-10 00:10  TensionRidden  阅读(240)  评论(0编辑  收藏  举报