使用递归输出n个不同字符的全排列

184 阅读1分钟
#include<stdio.h>
#include<stdlib.h>
#define M 10
//s存放n个字符
//out 存放要输出的序列
//b为out已排列数量
void ASort(char s[],char out[],int b){
	if(s[1]== '\0'){//只剩一个字符时打印结果
		out[b] = s[0];
		out[b+1] = '\0';
		puts(out);	
	}
	else{
		int i,j,k;
		char s1[M];
		for(i=0;s[i]!='\0';i++){//遍历s
			out[b] = s[i];
			k=0;
			for(j=0;s[j]!='\0';j++){//这里遍历存储去掉第i个字符的s于s1数组中
				if(i==j)	continue;
				s1[k++] = s[j];
			}
			s1[k] = '\0';//最后打上结束符
			ASort(s1,out,b+1);//继续递归去掉已保存在out中输的字符,同时b+1
		}
	}
}
void main()
{
	char s[] = "abced";
	char out[M];
	ASort(s,out,0);

}

输出为

abcd
abdc
acbd
acdb
adbc
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb
dbac
dbca
dcab
dcba