目录
一、题目内容
二、思路
思路1
思路2
思路3
三、代码实现
一、题目内容
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
思路:
第一步:首先对5名选手进行排序。
第二步:由于题目说每位选手都说对了一半,如何将这句话转化为编程语言?【突破口】
第三步:打印名次。
注:细节在下文中。
第一步:首先对5名选手进行排序
他们的排名都有可能是1、2、3、4名,可以使用for循环的嵌套来穷举所有的可能性。
#include <stdio.h>
int main()
{
//a、b、c、d赋值成多少都无所谓
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
//使用for循环的嵌套穷举
for (int a = 1;a <= 5;a++)
{
for (int b = 1; b <= 5; b++)
{
for (int c = 1; c <= 5; c++)
{
for (int d = 1; d <= 5; d++)
{
for (int e = 1; e <= 5; e++)
{
}
}
}
}
}
return 0;
}
第二步:【突破口】
每个人都都说对一半,那该怎么转化编程语言呢?
以A选手为例子:
A选手说:B第二,我第三
转化为编程语言:(b == 2)+(a == 3) == 1
解释:假设a说b第二为真(返回1),a第三为假(返回0),相加起来就是1,恰好和题中“每人都说对一半”相呼应。
#include <stdio.h>
int main()
{
//a、b、c、d赋值成多少都无所谓
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
//使用for循环的嵌套穷举
for (int a = 1;a <= 5;a++)
{
for (int b = 1; b <= 5; b++)
{
for (int c = 1; c <= 5; c++)
{
for (int d = 1; d <= 5; d++)
{
for (int e = 1; e <= 5; e++)
{
if ((b == 2) + (a == 3) == 1 //a说
&& (b == 2) + (e == 4) == 1 //b说
&& (c == 1) + (d == 2) == 1 //c说
&& (c == 5) + (d == 3) == 1 //d说
&& (e == 4) + (a == 1) == 1) //e说
{
}
}
}
}
}
}
return 0;
}
第三步:打印名次
#include <stdio.h>
int main()
{
//a、b、c、d赋值成多少都无所谓
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
//使用for循环的嵌套穷举
for (int a = 1;a <= 5;a++)
{
for (int b = 1; b <= 5; b++)
{
for (int c = 1; c <= 5; c++)
{
for (int d = 1; d <= 5; d++)
{
for (int e = 1; e <= 5; e++)
{
if ((b == 2) + (a == 3) == 1 //a说
&& (b == 2) + (e == 4) == 1 //b说
&& (c == 1) + (d == 2) == 1 //c说
&& (c == 5) + (d == 3) == 1 //d说
&& (e == 4) + (a == 1) == 1) //e说
{
printf("a:%d b:%d c:%d d:%d e:%d\n", a, b, c, d, e);
}
}
}
}
}
}
return 0;
}
程序结果:
从程序结果中发现:有些选手的名次重复了,这时可以再加上a*b*c*d*e==120来避免重复
【代码实现】
#include <stdio.h>
int main()
{
//a、b、c、d赋值成多少都无所谓
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
//使用for循环的嵌套穷举
for (int a = 1;a <= 5;a++)
{
for (int b = 1; b <= 5; b++)
{
for (int c = 1; c <= 5; c++)
{
for (int d = 1; d <= 5; d++)
{
for (int e = 1; e <= 5; e++)
{
if ((b == 2) + (a == 3) == 1 //a说
&& (b == 2) + (e == 4) == 1 //b说
&& (c == 1) + (d == 2) == 1 //c说
&& (c == 5) + (d == 3) == 1 //d说
&& (e == 4) + (a == 1) == 1) //e说
{
if (a * b * c * d * e == 120)//避免重复
{
printf("a的名次:%d\nb的名次:%d\nc的名次:%d\nd的名次:%d\ne的名次:%d\n", a, b, c, d, e);
}
}
}
}
}
}
}
return 0;
}
程序运行结果:
总结:这题的关键在于如何将第二步转化为编程语言。
2023年1月17日