c语言打碎花瓶题目?

如图,为什么判断条件只要那一行就行了,详细解释下

int a[4] = {0};  // a[0]:甲;a[1]:乙;a[2]:丙;a[3]:丁

        /* 0表示没打碎,1表示打碎:

         * 甲说:乙没有打碎,是丁打碎的 -> a[1]+a[3] == 1

         * 乙说:我没有打碎,是丙打碎的 -> a[1]+a[2] == 1

         * 丙说:甲没有打碎,是乙打碎的 -> a[0]+a[1] == 1

         */

if (a[1]+a[3] == 1 && a[1]+a[2] == 1 && a[0]+a[1] == 1)

为什么上述条件这么写呢?我猜测是因为“4个人中每个人要么是诚实的,要么总是说谎的。”我没看懂这个条件。

此类逻辑推理题,说谎与诚实这个条件是很重要的,由此,我用C语言实现了另一道逻辑推理题,供参考。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-11-24
因为甲乙丙说的话的模式是一样的,都是:
A&&!B(A和B分别表示甲乙丙丁中的一人,A表示是A打碎的,!B表示不是B打碎的)。
对于A&&!B,如果说这话的人说的是真话,则是A打碎的,不是B;如果说的是假话,则是B打碎的,不是A。也就是说,无论说的是真是假,肯定是其中一人打碎的。
所以,可以依次假设是甲乙丙丁打碎的(方法是令a[i]=1;),再验证是否矛盾。
据甲说,可推断是乙丁中其中一人打碎的,所以a[3]+a[1]应该等于1。
据乙说,可推断是乙丙中其中一人打碎的,所以a[2]+a[1]应该等于1。
据丙说,可推断是甲乙中其中一人打碎的,所以a[0]+a[1]应该等于1。

如果假设中的i能同时满足以上3个条件,则是下标为i的元素表示的人打碎的。
i=0,表示甲打碎的。
i=1,表示乙打碎的。
...。本回答被提问者采纳
相似回答