自己写的,实在落伍太多了。。。

#include <stdio.h>
/*回溯法求解1.....n的全排列问题*/
int isLegal(int B[],int n,int k){
/*若数组元素个数为n并且B中元素各异,则认为是最终解*/
    int i;
    int j;
    int flag=1;
    if(k==(n-1)){
        for(i=0;i<=k;i++){
            j=0;
            while(j<=k){
                 if((i!=j)&&(B[i]==B[j])){
                        flag=0;
                }
                j++;
            }
        }
    }else{
        flag=0;
    }
    return flag;
}
int isPart(int B[],int n,int k){
/*若数组元素个数小于n并且B中元素各异,则认为是部分解*/
    int i;
    int j=0;
    int flag=1;
    if(k<n-1){
        for(i=0;i<=k;i++){
            j=0;
            while(j<=k){
                if((i!=j)&&(B[i]==B[j])){
                        flag=0;
                }
                j++;
            }
        }
    }else{
        flag=0;
    }
    return flag;
}
void  pailie(int B[],int n){
    /*回溯迭代算法*/
    int k,j;
    int count=0;
    k=0;
    while(k>=0){
        while(B[k]<=n-1){
            B[k]=B[k]+1;
            if(isLegal(B,n,k)){
                /*储存或输出解向量*/
                printf("%2d:  ",++count);
                for(j=0;j<n;j++){
                    printf("%2d  ",B[j]);
                }
                printf("\n");
                break;
            }
            else if(isPart(B,n,k)){
                k=k+1;
            }
        }
        B[k]=0;
        k=k-1;
    }
}
void main(){
    int B[4]={0,0,0,0};
    printf("The list is as belows:\n");
    pailie(B,4);
    getch();
}