求解全排列问题

//穷举法

#include<stdio.h>
#define Maxn 10
#define MaxSize 1000
typedef struct{
	struct{
		int a[Maxn];
		int m;
	}data[MaxSize];
	int top;
}StackType;
void insert(int a[],int m,int j,int k){
	int i;
	for(i=m+1;i>j;i--)
		a[i] = a[i-1];
	a[j] = k;
}
void disp(int a[],int m){
	int i;
	for(i=1;i<=m;i++)
		printf("%d",a[i]);
	printf(" ");
}
void copy(int a[],int b[],int m){
	int i;
	for(i=1;i<=m;i++)
		b[i] = a[i];
}
int perm(int n){	//输出1~n的全排列 
	int j,m;
	int b[Maxn],c[Maxn];
	StackType st;
	st.top = -1;
	st.top++;
	st.data[st.top].a[1] = 1;
	st.data[st.top].m = 1;
	while(st.top != -1){
		m = st.data[st.top].m;
		if(m == n){
			disp(st.data[st.top].a,n);
			st.top--;
		}
		else{
			copy(st.data[st.top].a,c,m);
			st.top--;
			for(j=1;j<=m+1;j++){
				copy(c,b,m);
				insert(b,m,j,m+1);
				st.top++;
				copy(b,st.data[st.top].a,m+1);
				st.data[st.top].m = m+1; 
			}
		}
	} 
}
int main(){
	int n=3;
	printf("1~%d的全排列:",n);
	perm(n);
	printf("\n");
	return 0;
} 

  回溯法

#include<stdio.h>
void perm(char s[],int k,int n){
	int i;
	char tmp;
	if(k == n-1){
		for(i=0;i<n;i++)
			printf("%c ",s[i]);
		printf("\n");
	}
	else{
		for(i=k;i<n;i++){
			tmp = s[k];s[k] = s[i];s[i] =tmp;
			perm(s,k+1,n);
			tmp = s[k];s[k] = s[i];s[i] =tmp;
		}	
	}
}
int main(){
	int n=3;
	char s[] = "123";
	printf("全排列:\n");
	perm(s,0,n);
	printf("\n");
	return 0;
} 

  

posted @ 2020-01-03 22:44  Hqx_curiosity  阅读(267)  评论(0编辑  收藏  举报