#include<cstdio> #include<cstring> #include<algorithm> #define MAX 10 using namespace std; void swap(char *a,char *b)//字符交换 { char temp; temp=*a; *a=*b; *b=temp; } void Reverse(char *a,char *b)//反转A-B之间的字符 { while(a<b) swap(a++,b--); } bool Next_Permutation(char str[])//找下一个排序 { char *end,*find; char *p,*q; end=str+strlen(str); if(end==str)//字符串为空 return false; end--; p=end; while(p!=str) { q=p; p--; if(*p<*q)//找到降序相邻的两个数(倒着看) { find=end; while(*find<=*p)//从后往前找,找到比P大的第一个数 find--;//那么此数一定是大于P的最小的数,因为它是基于 swap(find,p);//上一次的排列 Reverse(q,end);//反转后面的子串 return true; } } Reverse(p,end);//如果排列达到最大值,翻转成最小值,返回FALSE return false; } int main(int argc,char *argv[]) { char str[MAX]; scanf("%s",str); int len=strlen(str); sort(str,str+len); do{ printf("%s\n",str); }while(Next_Permutation(str)); return 0; }
原文:http://blog.csdn.net/cstopcoder/article/details/21245149