读书人

回溯法解决 排列组合有关问题 全排 选

发布时间: 2012-09-27 11:11:17 作者: rapoo

回溯法解决 排列组合问题 全排 选排 可重复 不可重复

/* 华科机试练手 * 回溯法解决 排列组合问题 * 1 : 全排列 * 2 :可重复全排列 * 3 : 不可重复的选择排序 * …… */#include <stdlib.h>#include <stdio.h>int solution[100];/* 可重复全排 */int Perm(int a[], int n, int level){    int i;    static int sum = 0;    if(level == n)    {        sum++;        for(i=0; i<level; i++)            printf("%d\t",solution[i]);        printf("\n");        return;    }    for(i=0; i<n; i++)    {        if(1)        {            solution[level] = a[i];            Perm(a,n,level+1);        }    }    return sum;}/* 不可重复全排 */int NoReptPerm(int a[], int n, int level){    int i,j,selected = 0;    static int sum = 0;    if(level == n)    {        sum++;        for(i=0; i<level; i++)            printf("%d\t",solution[i]);        printf("\n");        return;    }    for(i=0; i<n; i++)    {        selected = 0;        for(j=0; j<level; j++)//检查是否已经被选过        {            if(solution[j] == a[i])            {                selected = 1;                break;            }        }        if(!selected)//没被选过        {            solution[level] = a[i];//加入解向量            NoReptPerm(a,n,level+1);        }    }    return sum;}/* 选择排序(不可重复) */int SelectPerm(int a[], int n, int m, int level){    int i,j,selected = 0;    static int sum = 0;    if(level == m)    {        sum++;        for(i=0; i<level; i++)            printf("%d\t",solution[i]);        printf("\n");        return;    }    for(i=0; i<n; i++)    {        selected = 0;        for(j=0; j<level; j++)//检查是否已经被选过        {            if(solution[j] == a[i])            {                selected = 1;                break;            }        }        if(!selected)//没被选过        {            solution[level] = a[i];//加入解向量            SelectPerm(a,n,m,level+1);        }    }    return sum;}int main(int argc, char *argv[]){    int i;    int a[] = {1,2,3};    i = Perm(a,3,0);    printf("Total : %d\n",i);    i = NoReptPerm(a,3,0);    printf("Total : %d\n",i);    i = SelectPerm(a,3,2,0);    printf("Total : %d\n",i);    return 1;}

读书人网 >编程

热点推荐