昨天写的有错误,今天修改了一下,另外根据题意改为只输出组合(按顺序排列的一组)
而不是排列,写的仓促可能还会有问题,欢迎提出宝贵意见!
#include "stdio.h"
#define TRUE
1
#define FALSE 0
/*===================================
算法描述:
题中给出的数组是自然数顺序的整数,只是
按照五位二进制格式输出,所以不用记下
每组的数,只是用整数来判断是否满足条件,
将符合条件的结果再按二进制展开输出即可。
在判断是否不同列的个数大于三时,用了异或
操作,再求出异或结果中1的个数简化操作。
===================================*/
/*===================================
判断两个数不同的列数是否大于3
===================================*/
int TwoLineIsValid(int a,int b)
{
int num=0;
a = a^b;
//求两个数的异或,结果的二进制格式有几个1,就有几个不同
//判断二进制格式中1的个数
do
{
if(1 == (a % 2))
num++;
a /= 2;
}while(a!=0);
if(num>=3)
return TRUE;
return FALSE;
}
/*===================================
判断一组数是否满足输出条件
===================================*/
int ArrIsValid(int arr[4])
{
int a,b;
for(a=0;a<3;a++)
{
for(b=a+1;b<4;b++)
{
if(TRUE != TwoLineIsValid(arr[a],arr[b]))
return FALSE;
}
}
return TRUE;
}
/*===================================
打印符合条件的数组
===================================*/
void Output(int input[4],int num)
{
int temp[5];
int arr[4];
int a,b;
for(a=0;a<4;a++)
{
arr[a]=input[a];
}
printf("%d:%d,%d,%d,%d\n",num,arr[0],arr[1],arr[2],arr[3]);
printf("**************************************\n");
for(a=0;a<4;a++)
{
for(b=0;b<5;b++)
{
temp[b] = 0;
}
b=0;
do
{
temp[b] = arr[a] % 2;
arr[a] /= 2;
b++;
}while(arr[a] != 0);
for(b=5;b>0;b--)
{
printf("%d\t",temp[b-1]);
}
printf("\n");
}
printf("**************************************\n");
printf("press Enter to continue...");
getchar();
}
int main()
{
int aLine[4];
//四行为一组,保存一组的序号
int a,b,c,d;
//循环变量数组
int num = 0;
//由于求的是组合不是排列,所以只求出顺序排列的一组
for(a=0;a<32;a++)
{
aLine[0] = a;
for(b=a+1;b<32;b++)
{
if(b == a)
continue;
aLine[1] = b;
for(c=b+1;c<32;c++)
{
if((c == a)||(c == b))
continue;
aLine[2] = c;
for(d=c+1;d<32;d++)
{
if((d == a)||(d == b)||(d == c))
continue;
aLine[3]=d;
if(TRUE == ArrIsValid(aLine))
{
num++;
Output(aLine,num);
}
}
}
}
}
getchar();
return 0;
}
[[it] 本帖最后由 moonwalker 于 2008-4-4 10:12 编辑 [/it]]