全排列
从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; }
转载请注明出处:http://www.cnblogs.com/ygdblogs