求解全排列问题
//穷举法
#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;
}
浙公网安备 33010602011771号