自己写的,实在落伍太多了。。。
#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();
}