/* 由于写文件速度很慢,当组合数很多的时候会很慢。如果只要求组合的个数,可以屏蔽掉写文件部分 */
#include <stdio.h>
#include <string.h>
#define N 20
static long icount = 0, inum = 0;
int tmparray[N];
char sFileName[64] = "result.txt";
void swap(int &a, int &b)
{
int t;
t = a;
a = b;
b = t;
}
/* 比较数组array与tmparray的前num个数是否相同 */
int isequal(int *array, int num)
{
for(int i = 0; i < num; i ++)
{
if(array[i] != tmparray[i])
return -1;
}
return 0;
}
/* 将数组array的数复制到tmparray */
void copy2tmp(int *array, int n)
{
for(int i = 0; i < n; i ++)
tmparray[i] = array[i];
}
/* 保存数组的前n个数 */
int savearray(int *array, int n)
{
FILE *fp;
if((fp = fopen(sFileName, "a")) == NULL)
{
printf("打开文件[%s]失败\n", sFileName);
return -1;
}
for(int i = 0; i < n; i++)
fprintf(fp, "%-4d", array[i]);
fprintf(fp, "\n");
fclose(fp);
return 0;
}
/**
* 数组array,数组中数个数n,组合数的个数num,当前位置pos
*/
void func(int *array, int n, int num, int pos)
{
if(pos == n-1)
{
icount ++;
/* 是第一组组合 */
if(icount == 1)
{
copy2tmp(array, n);
inum ++;
if(savearray(array, num) < 0)
return;
}
else
{
/* 当前组和上一组不同 */
if(isequal(array, num) != 0)
{
copy2tmp(array, n);
inum ++;
if(savearray(array, num) < 0)
return;
}
}
}
else
{
for(int i = pos; i < n; i ++)
{
swap(array[pos], array[i]);
func(array, n, num, pos+1);
swap(array[pos], array[i]);
}
}
}
int main(int argc, char *argv[])
{
int array[N] = {1, 3, 5, 8, 9, 10, 15, 20, 24};
/* 删除上一次运行结果文件 */
unlink(sFileName);
func(array, 9, 4, 0);
printf("总组数: %ld\n", inum);
return 0;
}
[[it] 本帖最后由 josen0205 于 2008-9-10 19:56 编辑 [/it]]