每日作业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 凶手

代码

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部