算法实现

1、排列算法

An​m=n(n−1)(n−2)....(n−m)

从n个数中挑选m个数进行排列,从第一个数开始,每个数可以从0到n个数中选择,以此类推到第m个数,且前面用过的数后面就不能再用,故用mark[]去记录这个数,并在每一次执行到m后清零。

#include <stdio.h>
#include <string.h> 
#define N 5
#define M 3
int a[N];
int b[M];
int arrange (int x,int n,int m,int a[],int b[]){
    static int mark[N] ={0};
    if(x == m){
        for(int i=0;i<m;i++){
            printf("%d,",b[i]);
        }
        printf("\n");
        return 0;
    }
    for(int i=0;i<n;i++){
        if(mark[i] == 0){
            b[x] = a[i];
            mark[i] ++;
            arrange(x+1,n,m,a,b);
            mark[i] =0;
        }
    }
    return 0;
} 
int main(){
    for(int i=0;i<N;i++)
        a[i] = i+1;
    return  arrange(0,N,M,a,b);
}

 

上一篇:app后端设计(13)--IM4JAVA+GraphicsMagick实现中文水印


下一篇:CCC 2011 J5 Unfriend 题解