如题
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
一开始想岔了写了一堆IF循环,最后还试了试多重函数嵌套,如图
但这种写法,导致一个问题,就是,原题所给的条件中并没有说明所有人的名次,只是说每个人有一半对
最后,解题思路如下
1,生成所有可能的排列组合
2,用每个排列组合和每个人说的话一一对应
最后,代码如下
以下提供复制
int chong_fu(int arr[])//判断是否有重复
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5;j++)
{
if (arr[i] == arr[j] && i != j)
{
return 0;
}
}
}
return 1;
}
int end(int* a, int* b, int* c, int* d, int* e)//判断条件
{
//A选手说:B第二,我第三;
if (*b == 2 || *a == 3)
{
//B选手说:我第二,E第四;
if (*b == 2 || *e == 4)
{
//C选手说:我第一,D第二;
if (*c == 1 || *d == 2)
{
//D选手说:C最后,我第三;
if (*c == 5 || *d == 3)
{
//E选手说:我第四,A第一;
if (*e == 4 || *a == 1)
{
return 1;
}
}
}
}
}
return 0;
}
int jie(int* a, int* b, int* c, int* d, int* 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)++)
{
int arr[5] = { *a,*b,*c,*d,*e };
if (chong_fu(arr) == 1)//判断是否有重复
{
if (end(a,b,c,d,e) == 1)
{
return 1;
}
}
}
}
}
}
}
return 0;
}
int main()
{
int a = 0, b = 0, c = 0, d = 0, e = 0;
jie(&a, &b, &c, &d, &e);
printf(" A:%d B:%d C:%d D:%d E:%d ", a, b, c, d, e);
return 0;
}
输出结果



