JAVA逻辑推理题1-谁是凶手

有六个人,姓名职业如下:

"小阳", 医生, 
"小刚",医生 
"小地", 医生, ;
"小温", 律师, 
"小红", 律师, 
"小丽", 律师, 

小阳妹妹是小地和小红

小丽哥哥是小刚,小温,

小阳的女朋友是小丽

这六个人里的一个人杀了其余五个人中的一个人。

(1)如果凶手和受害者有亲缘关系,则凶手是位男性;

(2)如果凶手和受害者没有亲缘关系,则凶手是位医生;

(3)如果凶手和受害者职业相同,则受害者是位男性;

(4)如果凶手和受害者没有相同工作,则受害者是位女性;

(5)如果凶手和受害者性别不同,则凶手是位律师;

(6)如果凶手和受害者性别相同,则受害者是位医生。

谁是凶手?

package demo;

import java.util.*;

public class Lj {

    static class Person {

        public String name;

        public int sex;  //性别 1男 2女

        public int occupation; //职业 1医生 2律师

        public Person() {

        }

        public Person(String name, int sex, int occupation) {
            this.name = name;
            this.sex = sex;
            this.occupation = occupation;
        }

        //判断是否是亲戚
        public boolean isRelative(Person p) {
            return (relatives1.contains(this.name) && relatives1.contains(p.name))
                    || (relatives2.contains(this.name) && relatives2.contains(p.name));
        }

        //判断是否相同职业
        public boolean isSameOccupation(Person p) {
            return this.occupation == p.occupation;
        }

        //判断性别是否相同
        public boolean isSameSex(Person p) {
            return this.sex == p.sex;
        }

        public boolean equals(Object o) {
            if (o == null)
                return false;
            if (o.getClass() == Person.class) {
                if (((Person) o).name == this.name) {
                    return true;
                }
            }
            return false;
        }
    }

    final static List<Person> PERSON_LIST = new ArrayList<>();

    static {
        PERSON_LIST.add(new Person("小阳", 1, 1));
        PERSON_LIST.add(new Person("小刚", 1, 1));
        PERSON_LIST.add(new Person("小地", 2, 1));
        PERSON_LIST.add(new Person("小温", 1, 2));
        PERSON_LIST.add(new Person("小红", 2, 2));
        PERSON_LIST.add(new Person("小丽", 2, 2));
    }

    //亲戚1
    static Set<String> relatives1 = new HashSet<>(Arrays.asList("小阳,小地,小红".split(",")));

    //亲戚2
    static Set<String> relatives2 = new HashSet<>(Arrays.asList("小丽,小刚,小温".split(",")));

    public static void main(String[] args) {
        BREAKPOINT:
        for (Person murderer : PERSON_LIST) {
            for (Person victim : PERSON_LIST) {

                boolean isRelative = murderer.isRelative(victim);
                boolean isSameOccupation = murderer.isSameOccupation(victim);
                boolean isSameSex = murderer.isSameSex(victim);

                boolean f1 = isRelative ? murderer.sex == 1 : murderer.occupation == 1;
                boolean f2 = isSameOccupation ? victim.sex == 1 : victim.sex == 2;
                boolean f3 = isSameSex ? victim.occupation == 2 : murderer.occupation == 2;

                if (f1 && f2 && f3 && !murderer.name.equals(victim.name)) {
                    System.out.println("凶手是" + murderer.name + ",受害人是" + victim.name);
                    break BREAKPOINT;
                }
            }
        }
    }

}

 

 

 

 

 

 

 

根据意,侦查员判断四人中有三人说的是真话,一人说的是假话。我们可以通过逻辑推理来解决这个问。我们可以为每个人的话分别赋予一个假设,然后根据假设来检查哪一个是不一致的,从而找到凶手。 在C语言中,我们可以通过定义每个说法的真伪来构建一个简单的逻辑推理程序。以下是C语言代码实现: ```c #include <stdio.h> int main() { // 假设A、B、C、D是否说谎分别为1表示说谎,0表示说真话 int A = 0, B = 0, C = 0, D = 0; int killer = -1; // 凶手编号,初始设为-1表示未找到 // 假设A说谎 A = 1; for (killer = 0; killer <= 3; killer++) { // 假设凶手可能是A、B、C、D中的一个 if ((killer == A) == A || (killer == C) == B || (killer == D) == C || (killer == C) == D) { // 如果有三个一致,即找到了凶手 continue; // 跳过当前循环 } } // 如果上面没有找到凶手,那么A说的是真话,我们需要重新检查 if (killer == -1) { A = 0; // 假设B说谎 B = 1; for (killer = 0; killer <= 3; killer++) { if ((killer == A) == A || (killer == C) == B || (killer == D) == C || (killer == C) == D) { continue; } } // 如果上面没有找到凶手,那么B说的是真话,我们需要重新检查 if (killer == -1) { B = 0; // 假设C说谎 C = 1; for (killer = 0; killer <= 3; killer++) { if ((killer == A) == A || (killer == C) == B || (killer == D) == C || (killer == C) == D) { continue; } } // 如果上面没有找到凶手,那么C说的是真话,我们需要重新检查 if (killer == -1) { C = 0; // 最后假设D说谎 D = 1; for (killer = 0; killer <= 3; killer++) { if ((killer == A) == A || (killer == C) == B || (killer == D) == C || (killer == C) == D) { continue; } } } } } // 输出凶手 switch (killer) { case 0: printf("A是凶手\n"); break; case 1: printf("B是凶手\n"); break; case 2: printf("C是凶手\n"); break; case 3: printf("D是凶手\n"); break; default: printf("没有找到凶手\n"); } return 0; } ``` 这段代码使用了一个简单的穷举法来检查每个假设,最终确定哪个假设与其他三个陈述一致,从而找出凶手。注意,这个代码逻辑上是正确的,但没有进行优化,实际可能有更加高效的算法来解决这个问
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值