把第3个数换到最前面来,准备打印3xx,再对后两个数1和2做全排列。 可见这是一个递归的过程,把对整个序列做全排列的问题归结为对它的子序列做全排列的问题,注意我没有描述Base Case怎么处理,你需要自己想。 你的程序要具有通用性,如果改变了N和数组a的定义(比如改成4个数的数组),其它代码不需要修改就可以...
} 想了一下,如果数组是字符型的就可以:char a[ONE][TWO]={{'1','5','8'},{'2','9'},{'3','6','4'},{'7','0'}};
include<stdio.h> define N 3 void main(){ int i,j,k,n,A[N];for ( i=0,n=0;i<N;i++ ) { n<<=1; n|=1; } n++;for ( i=0;i<n;i++ ){ for ( j=N-1,k=i;j>=0;j-- ) { A[j]=k&1; k>>=1; } for ( j=0;j<N;j++ ) printf("%d ",A[j])...
void CalcAllPermutation_R(char perm[], int first, int num){ if (num <= 1) { return;} for (int i = first; i < first + num; ++i) { swap(perm[i], perm[first]);CalcAllPermutation_R(perm, first + 1, num - 1);swap(perm[i], perm[first]);} } 注意要理解算法的...
2、定义一个数组,编程打印它的全排列。比如定义: #define N 3inta[N] = {1,2,3}; 则运行结果是: $ ./a.out123132213231321312 程序的主要思路是: 把第1个数换到最前面来(本来就在最前面),准备打印1xx,再对后两个数2和3做全排列。 把第2个数换到最前面来,准备打印2xx,再对后两个数1和3做全排...