题干: 公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的。在回答公安人员的问题中:甲说“乙没有偷,是丁偷的”, 乙说“我没有偷,是丙偷的”,丙说“甲没有偷,是乙偷的”,丁说“我没有偷”。请根据这四人的答话判断谁是盗窃者。
我在网上看到这样的代码感觉很简洁,分享给大家
#include <stdio.h>
int main
{
char cri;
for (cri = 'a'; cri <= 'd'; cri++)//a为甲 d为丁
{
if ((cri != 'b' + (cri == 'd') != 1) && ((cri != 'b') + (cri` == 'c') != 1) && ((cri != 'a') + (cri == 'b') != 1))
break;
}
putchar(cri);
return 0;
}
甲说“乙没有偷,是丁偷的”,
乙说“我没有偷,是丙偷的”,
丙说“甲没有偷,是乙偷的”,
丁说“我没有偷”。
若说真话则整句都是真的,若说假话则整句都是假的。(题干隐含意思)
想想这题的小偷会是谁,才能让他们的话不会互相冲突。
逻辑上 在已经找到小偷是谁的前提下
以甲为例:
cri != ‘b’ + (cri == ‘d’) != 1
小偷!=乙+(小偷==丁)!=1
恒成立 即无论甲说真话还是假话上式都成立
甲乙丙的逻辑用&&串起来时,可以判断是不是小偷,是的情况可以使所有人的话不起冲突。
然后在if语句外面套一层遍历for就能找出小偷