全排列之探索最简洁写法

全排列:即将从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;
}

 

点赞