读书人

满足一定要求的排列组合有关问题

发布时间: 2012-09-29 10:30:01 作者: rapoo

满足一定要求的排列组合问题

/* 华科机试练手 * 将1到9这九个数字分成3个三位数a,b,c, * 要求第1个三位数,正好是第2个三位数的两倍,是第3个三位数的三倍 */#include <stdlib.h>#include <stdio.h>int solution[100];int GetNum(int a[], int s, int e){    int i,sum=0;    for(i=s; i<e; i++)        sum = sum*10 + a[i];    return sum;}int Match(int solution[]){    int a=0,b=0,c=0;    a = GetNum(solution,0,3);    b = GetNum(solution,3,6);    c = GetNum(solution,6,9);    if(2*b==a && 3*c==a)        return 1;    else        return 0;}/* 不可重复全排 */int NoReptPerm(int a[], int n, int level){    int i,j,selected = 0;    static int sum = 0;    if(level == n)    {        if(!Match(solution))return;        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 main(int argc, char *argv[]){    int i;    int a[] = {1,2,3,4,5,6,7,8,9};    i = NoReptPerm(a,9,0);    printf("Total : %d\n",i);    return 1;}

读书人网 >编程

热点推荐