首页 > 其他分享 >5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果: A选手说:B第二,我第三; B选手说:我第二,E第四; C选手说:我第一,D第二; D选手说:C最后,我第三; E选手说:我第

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果: A选手说:B第二,我第三; B选手说:我第二,E第四; C选手说:我第一,D第二; D选手说:C最后,我第三; E选手说:我第

时间:2023-02-19 12:33:26浏览次数:38  
标签:killer 第二 凶手 第三 选手 fd && printf

完整题目

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:

A选手说:B第二,我第三;

B选手说:我第二,E第四;

C选手说:我第一,D第二;

D选手说:C最后,我第三;

E选手说:我第四,A第一;

比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

做这道题首先我们就要先知道总共的可能性

每个人都有5种可能那么就是5次循环列出所有的可能性,然后每一个1个成员说的话只有一半是真的那么就可以将其分析成一个表达式一半真一半假那么就是0+1为1,但还有非常重要的一点就是一个名次只能有一个人得。即个人相乘得到的答案只能是120代码思路就是如此

#include<stdio.h>
int main()
{
int a = 0, b = 0, c = 0, d = 0, e = 0;
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++)//上面的循环就是因为我们不知道这个选手的话究竟是哪里是真的哪一个又是假的那么我们就将所有的可能都列出来
{
//现在开始判断在c语言中真为1假为0
if ((b == 2) + (a == 3) == 1 &&
(b == 2) + (e == 4) == 1 &&
(c == 1) + (d == 2) == 1 &&
(c == 5) + (e == 3) == 1 &&
(e == 4) + (a == 1) == 1//这些式子就是从选手的话里面提取出来的信息
)
{
if (a*b*c*d*e == 120)//这句代码非常的关键如果没有这句代码我们就会打印出多组结果因为我们没有将一个位置只能有一个人占据给考虑进去这句代码就是将这个考虑给带入进去如果不加这个就会出现一个名词有两个人或几个人占据的情况
//这里我们假设a为1b为2c为3d为4e为5相乘得120
{
printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
}
}
}
}
}
}
}
return 0;
}

还有一道和这个非常类似的题目

题目日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。


以下为4个嫌疑犯的供词:

A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

已知3个人说了真话,1个人说的是假话。

现在请根据这些信息,写一个程序来确定到底谁是凶手

#include<stdio.h>
int main()
{
int a = 0, b = 0, c = 0, d = 0;
for (a = 0; a <= 1; a++)
{
for (b = 0; b <= 1; b++)
{
for (c = 0; c <= 1; c++)
{
for (d = 0; d <= 1; d++)
{//上面的代码
if ((a != 1) + (c == 1) + (d == 1) + (d != 1)==3)
{
if (a + b + c + d == 1)
{
if (a == 1)
printf("a为凶手");
else if (b == 1)
printf("b为凶手");
else if (c == 1)
printf("c为凶手");
else
printf("d是凶手");
}
}
}
}
}

return 0;
}
}

我写的这个的思路就是和上面我写的那个一样每个abcd四个人要么为0要么为1通过四个循环得到所有的结果,之后我们通过这四个人说的话将其翻译为代码然后有一个人说谎那么他说的话得到的就是0其他人说的是真话得到的答案为1那么四个表达式相加就为3

但是千万不能忘了凶手只有一个那么四个值相加就只能为1最后再通过if语句判断哪一个是1由此就能得到谁是凶手了。代码运行结果如图

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:    A选手说:B第二,我第三;  B选手说:我第二,E第四;  C选手说:我第一,D第二;  D选手说:C最后,我第三;  E选手说:我第_#include

还有其它的解法

方法步骤如下就是

1、每次假设一个人说了谎,4 次循环

然后cd说话矛盾fd为1则表示矛盾任然存在为0则表示矛盾消失那么当在这四次循环中有谁满足了只有一个凶手且fd为0则就抓住了凶手。

下面就是代码演示

#include<stdio.h>
int main()
{
int a=0, b=0, c=0, d=0, fd=0;
int i = 0;
for (i = 0; i < 4; i++)
{
if (i == 0)//假设a说的就是假话
{
a = 1; c = 1; d = 0; fd = 1;
}
if (i == 1)//假设b说的是假话
{
a = 0; c = 0; d = 0; fd = 1;
}
if (i == 2)//假设c说的是假话
{
a = 0; c = 1; d = 0; fd = 0;
}
if (i == 3)//假设d说的是假话
{
a = 0; c = 1; d = 1; fd = 0;
}
if ((a + b + c + d + fd == 1) && (fd == 0))//锁定唯一的凶手
{
printf("A是%d,B是%d,c是%d,d是%d\n", a, b, c, d);//这里结果为1的那个人就是凶手
}
}
return 0;
}

解法三与我的解法一思路是差不多的

只不过用的是字符的形式(因为从a到d的asccll值是递增的就可以使用遍历的方式)

#include<stdio.h>
int main()
{
int killer = 0;
for (killer = 'A'; killer <= 'D'; killer++)
{
if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)//有三个人说的是真话相加就为3因为真为1不真为0
{
printf("killer是%c", killer);
}
}
return 0;
}//这个对比我的写法是有很方便的一点就是只有一个变量killer那么在判断凶手就不用四个if语句并且这个代码非常的简便

运行结果

如图

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:    A选手说:B第二,我第三;  B选手说:我第二,E第四;  C选手说:我第一,D第二;  D选手说:C最后,我第三;  E选手说:我第_if语句_02


标签:killer,第二,凶手,第三,选手,fd,&&,printf
From: https://blog.51cto.com/u_15838996/6066689

相关文章