前几天碰到一个算法问题,涉及到全排列。刚好也想温习一下算法,所以就写出来,意思意思。
题目大致是这样的:
有9个数字,分成3组,每组中的三位数分别构成一个数,使得这三个数的比例为1:2:3。
问:有多少组这样的数,分别打印出来。
上代码:
#include "stdio.h"
#include "stdlib.h"
int count(int i); //判断9个数中各自扩大的倍数
void swap(int a[], int n, int m);//交换两个元素
void arrange(int a[], int st, int len);//排序方法的实现
int total=1;
int array[9] = { 0 };
int num = 1;
int count(int i)
{
if (i % 3 == 0)
{
return 1;
}
if (i % 3 == 1)
{
return 100;
}
else
{
return 10;
}
}
void swap(int a[], int n, int m) //交换数组中对应位置的数据
{
int temp;
temp = a[n];
a[n] = a[m];
a[m] = temp;
}
void arrange(int a[], int st, int len)
{
if (st == len - 1) {
int i;
for (i = 0; i<len; ++i) //将三组中的每个数分别乘以100,10,1
{
array[i] = a[i] * count(num);
num++;
}
for (i = 0; i<7; i = i + 3) //判断三个数是否成1:2:3关系,是,则输出
{
array[i]+ = array[i]+array[i+1]+array[i+2];
if (((array[0] * 2) == array[3]) && ((array[0] * 3) == array[6]))
{
printf("%d,%d,%d", array[0], array[3], array[6]);
printf("\n");
}
}
total++;
}
else
{
for (int i = st; i<len; i++)
{
swap(a, st, i);
arrange(a, st + 1, len);
swap(a, st, i);
}
}
}
int main()
{
int a[] = { 1,2,3,4,5,6,7,8,9 };
printf("排列结果:\n");
arrange(a, 0, 9);
printf("排列组合数%d\n", total);
printf("Hello World\n");
system("pause");
return 0;
}
具体的内容在注释里面都有,主要就是一个全排列算法的应用(没有涉及到排列中重复元素的问题)。