猜凶手
日本某地发生了一件谋杀案,警察通过排查确定凶手为四人中的一个,以下是四个嫌疑犯的供词:
A说:不是我;
B说:是C;
C说:是D;
D说:c在胡说
已知3个人说了真话,1个人说的是假话请写一个程序来判断谁是凶手?
首先应该先用日常的思维来分析一下:
因为有三个人说了真话,一个说的假话
假设一:
如果
A说的是假话-->凶手是A
B说的是真话 --> 凶手是C
C说的是真话 -->凶手是D
D说的是真话 -->凶手不是D
这样就能看出这个假设矛盾了
假设二:
如果
A说的是真话 -->凶手不是A
B说的是假话 --> 凶手不是C
C说的是真话 -->凶手是D
D说的是假话 -->凶手不是D
这样就能看出这个假设矛盾了
假设三:
如果
A说的是真话 -->凶手不是A
B说的是真话 --> 凶手是C
C说的是假话 -->凶手不是D
D说的是真话 -->凶手不是D
这样就能看出这个假设成立
后面的就不用考虑了
以下用代码来实现这个思维
int main()
{
int killer = 0;//定义杀手
for (killer = 'A'; killer <= 'D'; killer++) //遍历从 A 到 D
{
if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
//这行if语句的判断条件也就是上述四个人所说的话 且有三个人说的真话
//拿killer != 'A'举例子 如果条件成立返回1
//那么上述四个条件相加如果等于3的话 即代表有三个人是真话 一个是假话
{
printf("killer is %c\n", killer);
}
}
return 0;
}
再从代码的角度分析一下
首先定义了一个for循环 从字母A到字母D表示四个人
进入循环内部有一个if语句
直接将上面四个人说的话“翻译”成代码的形式
例如 killer !='A' 那不就代表 --->A说:不是我;
后面的也同理我就不列举了
然后就是四个判断条件相加等于3
也是很好理解的
如果
killer !='A' 的判断结果是 0
就代表A说的是假话
后面的其他三个条件也是同理