求list[l:r]的元素全排列大概思想就是让[l:r],变量i从l到r,也就是数组中的元素轮流来当第一位,然后递归着求list[l+1:r]的全排
列,直至到末尾触碰到了边界就直接输出list[l:r],也就是他的一种情况。 但是要注意的是当变量换位递归结束了之后要换回原来的
数组状态,这样才能保证每个元素都轮流存在过一个位置。
具体代码:
#include <stdio.h>
#define N 10
void Swap(char *a, char *b){
// printf("1:%c 2:%c\n",*a,*b);
char temp;
temp = *a;
// printf("\ntemp:%c",temp);
*a = *b;
*b = temp;
return;
}
void Perm(char list[],int k, int m){
// printf("123");
if(k == m)//到末尾了直接输出
{
// printf("\n&\n");
int i;
printf("\n");
for(i = 1;i <=m ; i++){
printf("%c",list[i]);
}
printf("\n");
return;
}
else
{
// printf("\n**");
int i;
for(i = k; i<=m; i++)
{
// printf("\ni:%d",i);
Swap(&list[k],&list[i]);//交换list[k:m]与list[k]的值 之后再递归地解决list[k+1:m]的全排列
// printf("\n1swap");
Perm(list,k+1,m);
Swap(&list[k],&list[i]);//再次交换回来,继续下一步
}
}
return;
}
int main(){
int i,n;
int start,end;
char r[N];
printf("请输入要排列元素总个数:");
scanf("%d",&n);
// printf("%d",n);
getchar();
printf("\n请输入要排列元素(空格分隔):\n");
for(i = 1;i<=n;i++)
{
scanf("%c",&r[i]);
if(i!=n)
getchar();
}
// for(i = 1;i<=n;i++)
// {
// printf("%c",r[i]);
// }
// printf("\n");
printf("请输入要排序的起点和终点(空格隔开):");
scanf("%d%d",&start,&end);
printf("\n排序结果为:\n");
Perm(r,start,end);
}