全排列:即将从n和物品中选取n个,讲究次序的排成一列。
【原创】简洁递归求解所有全排列(输入时为字符串时)
#include<stdio.h>
#include<string.h>
#define SIZE 100
/*全排列递归核心 作者:天之*/
void fun(int deep,char *str,char *res,int maxDeep){
int i;
if(deep==maxDeep){
printf("%s\n",res);
}else{
for(i=0;i<maxDeep;i++){
if(str[i]!='#'){
res[deep]=str[i];
str[i]='#';
fun(deep+1,str,res,maxDeep);
str[i]=res[deep];
}
}
}
}
int main(){
int len;
char res[SIZE-1];
char str[SIZE];
while(1){
gets(str);
len=strlen(str);
res[len]='\0';//结束
fun(0,str,res,len);
}
return 0;
}
【原创】递归求解数字所有全排列(要求输入时为数字时)
#include<stdio.h>
/*数字转字符串且返回数字长度*/
int n2Str(int n,char *str){
int i=0;
*str++='#';
do{
*str++=n%10+'0';
n/=10;
i++;
}while(n!=0);
*str='\0';
return i;
}
/*全排列递归核心 作者:天之*/
void fun(int deep,char *str,char *res,int max){
int i;
if(deep==max){
printf("%s\n",res);
}else{
for(i=1;i<=max;i++){
if(str[i]!='#'){
res[deep]=str[i];
str[i]='#';
fun(deep+1,str,res,max);
str[i]=res[deep];
}
}
}
}
int main(){
int n,i;
char res[10];
char str[11];
while(1){
//初始化
for(i=0;i<10;i++){
res[i]='\0';
}
scanf("%d",&n);
fun(0,str,res,n2Str(n,str));
}
return 0;
}