咋说呢,对这种类型的题目应该追溯到小学六年级下册,上册还是下册,我忘了,但是小学六年级是非常清楚的,依稀记得一元一根的抹辣椒的淀粉肠,果冻屋,鸡蛋包香肠, 还有美醉了的公立学校老师办的私立补习班培养出的一系列的白眼狼,害.........
对我一个喜欢悲观的人来说,回忆它总是伤痛的,刻薄的,夹杂着尴尬的苦酒,但不必时刻品尝
---------题记
我们回归这一道题目,这种逻辑推理形式的判断题目并不常见,但是却可以考到一个比较不错的练习的点,就是利用表达式的真假转换为1 or 0从而来求值判断程序执行逻辑,而这种对表达式的真假来赋值运算在程序里有时就是"妙手":
例如:
while(scanf("%d",&number) != EOF)
{
//........
}
我们回归这一道题目本身,可以用假设来推断谁在说谎:
假设只有A在说谎:
A是盗窃者为真,剩下三个人中仅仅D说了真话,很明显不符合逻辑,排除;
假设只有B在说谎:
C一定不会是盗窃者为真,C说的是真话的话,此回合D为盗窃者,D说的也就是谎话,矛盾出现,排除;
假设只有C在说谎:
D一定不会是盗窃者为真,其他三人若说的是真话,则B说是C一定为真话,回合内C为盗窃者,AD发言均被证实,及该回合满足题干逻辑,C在说谎,ABD均没有说谎,且C为盗窃者;
假设只有D在说谎:
D说C胡说,那么C说的就是真的,此回合D为说谎者,B指正C为说谎者,矛盾出现,排除;
(可见四个人都不会说对自己不利的话啊.........)
但当然我们要把这些传递给程序,让程序去判断:
大致思路如下:三个人说真话,一个人说谎话,
纵观题目,我们可以给是否为盗窃者分别对stealer赋值'a' ~ 'd';
A B C D 的 ASCII码相邻,循环四次,每次分别对每个字符赋值1,把他们说的话都当作一个逻辑判断语句,语句为真的时候语句返回值为1,否则为0,四个语句值加起来必须为3,否则这个循环赋给这个人为凶手就是不成立的,循环继续,知道找到凶手
写到这里思路已经完备了,给出StealerFinder v1代码:
#include <stdio.h>
int main()
{
int stealer = 0;
for(stealer = 'a';stealer <= 'd';stealer++)
{
if((stealer != 'a') + (stealer == 'c')+ (stealer == 'd') + (stealer != 'd') == 3)
printf("The stealer is %c",stealer);
}
return 0;
}
但我们有无比的学习热情,我们要继续设计代码,找出谁是那个说谎者,我们在原有代码的基础上,给出一定程度上的更改:
#include <stdio.h>
int main()
{
int stealer = 0;
for(stealer = 'a';stealer <= 'd';stealer++)
{
int WordA = (stealer != 'a');
int WordB = (stealer == 'c');
int WordC = (stealer == 'd');
int WordD = (stealer != 'd');
if(WordA + WordB+ WordC + WordD == 3)
{
printf("The stealer is %c \n" ,stealer);
if(WordA == 0)
printf("The liar is a\n");
else if(WordB == 0)
printf("The liar is b\n");
else if(WordC == 0)
printf("The liar is c\n");
else
printf("The liar is d\n");
}
}
return 0;
}
运行结果:
是这样的,自己犯了错心虚,所以那个说谎者一定是自己,但是有的时候别人也会说谎,那样就是共犯了(doge)
我之所以在这里发博客,是为了警醒自己写代码不要眼高手低,有些代码你觉得你看一看下一次也能写出来,这就是及其愚蠢的,自己从0--->1才是真正是自己的.
以后每天更至少一题,还会更新一些其他的总结性的给我自己看的记录的内容.
---2024/11/29