全排列
来源:互联网 发布:沈阳网络团队组建 编辑:程序博客网 时间: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