猜凶手
猜凶手
题目内容:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:A说:不是我。//0(假)
B说:是C。//0
C说:是D。//0
D说: c在胡说//1
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写-个程序来确定到底谁是凶手
原理
这里假设a是凶手
如果a是凶手3假1,真不满足条件,不满足就换个人假设直到3个人说了真话,1个人说的是假话。成立
实现方法(假设法)
int killer = 0;
for (killer = 'a'; killer <= 'd'; killer++){
if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3){
printf("killer = %c\n", killer);
}
}
结果
游泳比赛
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A选手说: B第二, 我第三;
B选手说:我第二,E第四; .
C选手说:我第一,D第二;
D选手说: C最后,我第三;
E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半, 请编程确定比赛的名次。
实现方法(穷举法)
原理
把所有的可能显示出来进行过滤
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int 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++)
{
if (((b == 2) + (a == 3) == 1) &&
((b == 2) + (e == 4) == 1) &
((c == 1) + (d == 2) == 1) &&
((c == 5) + (d == 3) == 1) &&
((e == 4) + (a == 1) == 1))
{
printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
}
}
}
}
}
加上过滤12345名一人只有一个if (a * b * c * d * e == 120)