满足一定要求的排列组合问题
/* 华科机试练手 * 将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;}