有序全排列
比如对123进行全排列,输出

最后两个是3 1 2和 3 2 1 而不是 3 2 1和 3 1 2
所以这就需要在每次交换左端值后将交换的两元素之间的元素进行有序化。
1 #include<stdio.h> 2 3 int a[10000]; 4 void change(int *p, int *q) 5 { 6 int t; 7 t = *q; 8 *q = *p; 9 *p = t; 10 } 11 void cirr(int a[], int l, int r) 12 { 13 if(l>=r)//少了这个真是裂开 14 return; 15 else 16 { 17 int i,t; 18 t = a[r]; 19 for(i=r-1; i>=l; i--) 20 { 21 a[i+1] = a[i]; 22 } 23 a[l] = t; 24 } 25 }//这个当移动第一个数的时候会出现l>r的情况,后面再交换值时,如果只有一个元素,那么都l==r 26 void cirl(int a[], int l,int r) 27 { 28 if(l>=r) 29 return; 30 else 31 { 32 int i,t; 33 t = a[l]; 34 for(i=l; i<r; i++) 35 { 36 a[i] = a[i+1]; 37 } 38 a[r] = t; 39 } 40 41 } 42 void perm(int a[],int l, int r) 43 { 44 int i; 45 if(l==r) 46 { 47 for(i=1; i<=r; i++) 48 printf("%d ",a[i]); 49 printf("\n"); 50 } 51 else 52 { 53 for(i=l; i<=r; i++) 54 { 55 change(&a[i],&a[l]); 56 cirr(a,l+1,i);//右移动 57 perm(a,l+1,r); 58 cirl(a,l+1,i);//左移动 59 change(&a[i],&a[l]); 60 } 61 } 62 } 63 int main() 64 { 65 int i,n; 66 scanf("%d",&n); 67 for(i=1; i<=n; i++) 68 a[i] = i; 69 perm(a,1,n); 70 return 0; 71 }

浙公网安备 33010602011771号