题目:5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
分析:比赛的名次有第1名、第2名、第3名、第4名、第5名,对应着5个人。每一个都可能是这5个名次中的一种。所以排列组合就是2^5种情况,所以可以使用枚举的方法,利用5个for循环嵌套;再根据条件进行筛选。“筛选”要注意的点:名次不能出现间隔
具体每次筛选参见代码注释。
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int A, B, C, D, E;
for (A = 1; A <= 5; A++)
{
for (B = 1; B <= 5; B++)
{
for (C = 1; C <= 5; C++)
{
for (D = 1; D <= 5; D++)
{
for (E = 1; E <= 5; E++)
{
//初步筛选:根据每位选手都说对一半
if ((B == 2 || A == 3) + (B == 2 || E == 4) + (C == 1 || D == 2) + (C == 5 || D == 3) + (E == 4 || A == 1) == 5)
{
//再次筛选:因为第一层筛选结果还包含这种情况:一个人说的2句话都对。所以进行与运算的目的是把这种情况过滤掉
if ((B == 2 && A == 3) + (B == 2 && E == 4) + (C == 1 && D == 2) + (C == 5 && D == 3) + (E == 4 && A == 1) == 0)
{
//第三次筛选:多滤掉出现间隔名次(比如,只有1,2,5名)的情况和并列名次的情况,让名次只有1,2,3,4,5
if (A != B&&A != C&&A != D&&A != E&&B != C&&B != D&&B != E&&C != D&&C != E&&D != E)
{
printf("A:%d,B:%d,C:%d,D:%d,E:%d\n", A, B, C, D, E);
}
}
//goto end;
}
}
}
}
}
}
//end:
system("pause");
return 0;
}
三次筛选示意图: