全排列

来源:互联网 发布:沈阳网络团队组建 编辑:程序博客网 时间:2024/04/29 11:56
从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;}

 

0 0
原创粉丝点击