趁着复习把课上的作业和代码上传上来嘿嘿嘿,这个系列的代码都是自己写的或者老师教学用的可能内存管理上有点小瑕疵,但是算法理解还是不错的!本系列所有代码在dev-cpp上可以跑通~
全排问题:
输入一个n,输出从1到n的全排列:如输入2,输出1 2和2 1.
#include<stdio.h>
void Display(char a[],int n){
for(int i=0;i<n;i++){
printf("%c ",a[i]);
}
printf("\n");
}
void swap(char*a,char*b){
char t;
t=*a;
*a=*b;
*b=t;
}
void perm(char a[],int k,int n){
if(k==n-1){
Display(a,n);
}
else{
for(int i=k;i<n;i++){
swap(&a[k],&a[i]);
Perm(a,k+1,n);
swap(&a[k],&a[i]);
}
}
}
int main(){
char a[]="abc";
Perm(a,0,3);
return 0;
}
使用递归的方法解决,我们采用的每次进入递归时交换特定的两个元素,然后进入递归,再交换两个特定的元素……出来的时候将元素恢复成原来的位置关系。
那递归出口怎么判定呢?
void perm(char a[],int k,int n){
if(k==n-1){
Display(a,n);
}
else{
for(int i=k;i<n;i++){
swap(&a[k],&a[i]);
Perm(a,k+1,n);
swap(&a[k],&a[i]);
}
}
}
为了防止交换重复,我们每次交换k~n-1与k位的位置,然后下一次变成k+1……最后到k==n-1时,已经没有东西可以交换了,这时候我们输出结果。