目录
猜名次问题
典例题目
题目分析:
代码实现:
运行结果:
猜凶手问题
典例题目
题目分析
代码实现:
运行结果:
猜名次问题
典例题目
猜名次:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
题目分析:
暴力求解:
直接用5层for循环遍历;
两条件:
条件1:A,B,C,D,E选手每个人只能有一个名次,可以知道他们的名次乘积为1*2*3*4*5=120;
条件2:由题目可知,每个选手都说对了一半;C语言中,如果条件为真结果为1,为假即为0;
所以第二个条件可以用这个性质得出:(A==3)+(B==2)==1&&
(B==2)+(E==4)==1&&
(C==1)+(D==2)==1&&
(C==5)+(D==3)==1&&
(E==4)+(A==1)==1
代码实现:
int main()
{
printf("ABCDE的名次依次为:\n");
int A, B, C, D, E;
for (A = 1; A < 6; A++)
{
for (B = 1; B < 6; B++)
{
for (C = 1; C < 6; C++)
{
for (D = 1; D < 6; D++)
{
for (E = 1; E < 6; E++)
{
if((A==3)+(B==2)==1&&
(B==2)+(E==4)==1&&
(C==1)+(D==2)==1&&
(C==5)+(D==3)==1&&
(E==4)+(A==1)==1&&
A*B*C*D*E==120)
{
printf("%d %d %d %d %d", A, B, C, D, E);
}
}
}
}
}
}
return 0;
}
运行结果:
猜凶手问题
典例题目
猜凶手
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
题目分析
这题和猜名次问题非常相似,所以我们可以用猜名次的思想一样解决
因为猜名次问题A,B,C,D,E都是等于某个名次,都是数
1.所以我们这里规定如果是凶手就为1,不是就为0;
2.这里有4个人,所以用4层for循环
3.两个条件:
条件1:因为他们当中只有一个人说了假话,所以类似猜名次问题,条件可改为
(((A != 1) + (C == 1) + (D == 1) + (D != 1) == 3) && (A + B + C + D == 1))
条件2:因为凶手只有一个,只有一个为1,所以条件可以是:
A+B+C+D==1
4.最后再判断谁是1,如果是1就打印谁的名字
代码实现:
int main()
{
int A, B, C, D;
for (A=0;A<2;A++)
{
for (B = 0; B < 2; B++)
{
for (C = 0; C < 2; C++)
{
for (D = 0; D < 2; D++)
{
if (((A != 1) + (C == 1) + (D == 1) + (D != 1) == 3) && (A + B + C + D == 1))
{
if (A == 1)
{
printf("凶手是A\n");
}
if (B == 1)
{
printf("凶手是B\n");
}
if (C == 1)
{
printf("凶手是C\n");
}
if (D == 1)
{
printf("凶手是D\n");
}
}
}
}
}
}
return 0;
}
运行结果: