每日作业20200515 - 4人说谎问题

题目

已知有四个人 A、B、C、D 是嫌疑人,四人分别陈述如下:
    A说:不是我。
    B说:是C。
    C说:是D。
    D说:C在胡说
    已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定谁是罪犯

分析

case 1: 如果说A说的是假话,即BCD说的都是真话。即 是A,是C,是D,不是D。说法相互矛盾,该推论错误。

case 2: 如果说B说的是假话,即ACD说的都是真话。即 不是A,不是C,是D,不是D。说法相互矛盾,该推论错误。

case 3: 如果说C说的是假话,即ABD说的都是真话。即 不是A,是C,不是D,不是D。此推论正确,C是嫌疑人。

case 4: 如果说D说的是假话,即ABC说的都是真话。即 不是A,是C,是D,不是D。说法相互矛盾,该推论错误。

因为说谎者即是罪犯,即只要找出说谎者就能解决问题

代码

public class Homework0515 {
    public static void main(String[] args) {
        char[] person = {'A', 'B', 'C', 'D'};   //嫌疑人名单
        int temp = 0;   //储存数组下标

        for(int i = 0; i < 4; i++){
        	/*
        	* person[i] 表示罪犯
        	* A说:不是我。		person[i] != 'A'
			* B说:是C。			person[i] == 'C'
			* C说:是D。			person[i] == 'D'
			* D说:C在胡说		person[i] != 'D'
			* 
        	* 因为只有 3 个人说了真话,1 个人说的是假话
			* 所以当和为 3 时,即为判定条件成立
			* 只找说谎者
			*/
            if((  	  ( person[i] != 'A' ? 1 : 0 )   //1表示嫌疑人不是A,说明A说真话
	                + ( person[i] == 'C' ? 1 : 0 )   //1表示嫌疑人是B,	说明B说真话
	                + ( person[i] == 'D' ? 1 : 0 )   //1表示嫌疑人是D,	说明C说真话
	                + ( person[i] != 'D' ? 1 : 0 )   //1表示嫌疑人不是D,说明D说真话
               ) == 3 ){
                temp = i; //赋值给i
            }
        }
        System.out.println( person[temp] + " 是罪犯");
    }

}

总结

该题难点在于,怎么把陈述的内容,用代码进行表达,进而进行逻辑上的表示,并找出判定条件

思考

如果,4人分别陈述如下:
	A说:不是我。
	B说:不是D。
	C说:是D。
	D说:A说的对
仍是 3 个人说了真话,1 个人说的是假话。

判断:谁说谎,谁是罪犯

分析

case 1: 若A说谎,即BCD说的都是真话。即 (是A),不是D, 是D,   A对-不是A。 说法相互矛盾,该推论错误。
                                       1      0     1         0
case 2: 若B说谎,即ACD说的都是真话。即  不是A,(是D),是D,   A对-不是A。    此推论说明D是嫌疑人。
                                       0      1     1         0
case 3: 若C说谎,即ABD说的都是真话。即  不是A,不是D,(不是D),A对-不是A。  无法判断。
                                       0      0     0          0
case 4: 若D说谎,即ABC说的都是真话。即  不是A,不是D,是D,   (A错-是A)。  说法相互矛盾,该推论错误。
                                       1      0     1          1
* B 说谎
* D 凶手

代码

待解答

若哪位大佬有解法,欢迎私聊或评论,一起探讨,感激不尽
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值