void Swap (char *a, char *b)
{
char tmp=*a;
*a=*b;
*b=tmp;
}
//全排列函数,核心代码
void AllRange(char *Str,int k,int m)
{
if(k==m)
{
static int s_i=1;
int i,j,k;
char a,b,c;
for(i=0; i<=m-2; i++)
{
a=Str[i];
for(j=i+1; j<=m; j++)
{
b=Str[j];
for(k=j+1; k<=m; k++)
{
c=Str[k];
if(a>b&&a>c&&b<c)
return;
}
}
}
printf("第%d 个排列是%s\n",s_i++,Str);
}
else
{
for(int i=k; i<=m; i++)
{
Swap(&Str[i],&Str[k]);//交换使用地址传递
AllRange(Str,k+1,m);//再对 Str[k+1]至 Str[m]排列
Swap(Str+i,Str+k);//因为我们不仅要找到一组故还要把 Str 恢复成原来样子,即回溯前进时交换的回退时再交换回来
}
}
}
int main()
{
char Str[] = "12345";
printf("%s 的全排列如下:\n", Str);
AllRange(Str,0,strlen(Str)-1);
}