有六个人,姓名职业如下:
"小阳", 医生,
"小刚",医生
"小地", 医生, ;
"小温", 律师,
"小红", 律师,
"小丽", 律师,
小阳妹妹是小地和小红
小丽哥哥是小刚,小温,
小阳的女朋友是小丽
这六个人里的一个人杀了其余五个人中的一个人。
(1)如果凶手和受害者有亲缘关系,则凶手是位男性;
(2)如果凶手和受害者没有亲缘关系,则凶手是位医生;
(3)如果凶手和受害者职业相同,则受害者是位男性;
(4)如果凶手和受害者没有相同工作,则受害者是位女性;
(5)如果凶手和受害者性别不同,则凶手是位律师;
(6)如果凶手和受害者性别相同,则受害者是位医生。
谁是凶手?
public class FindMuderer { static enum JOB { DOCTOR, LAWYER } static enum SEX { MAN, WOMEN } static class Pepole { String name; JOB job; SEX sex; static Pepole newPepole(String name, JOB job, SEX sex) { Pepole p = new Pepole(); p.name = name; p.sex = sex; p.job = job; return p; } public boolean equals(Object o) { if (o == null) return false; if (o.getClass() == Pepole.class) { if (((Pepole) o).name == this.name) { return true; } } return false; } public String toString() { return this.name; } } static class Relation { static List<List<Pepole>> pepoles = new ArrayList<List<Pepole>>(); } /** * @param args * 这六个人里的一个人杀了其余五个人中的一个人。 (1)如果凶手和受害者有亲缘关系,则凶手是位男性; (2)如果凶手和受害者没有亲缘关系,则凶手是位医生; (3)如果凶手和受害者职业相同,则受害者是位男性; (4)如果凶手和受害者没有相同工作,则受害者是位女性; (5)如果凶手和受害者性别不同,则凶手是位律师; (6)如果凶手和受害者性别相同,则受害者是位医生。 */ public static void main(String[] args) { //定义六个人的姓名,职业,性别. Pepole pa = Pepole.newPepole("小阳", JOB.DOCTOR, SEX.MAN); Pepole pb = Pepole.newPepole("小刚", JOB.DOCTOR, SEX.MAN); Pepole pc = Pepole.newPepole("小地", JOB.DOCTOR, SEX.WOMEN); Pepole pd = Pepole.newPepole("小温", JOB.LAWYER, SEX.MAN); Pepole pe = Pepole.newPepole("小红", JOB.LAWYER, SEX.WOMEN); Pepole pf = Pepole.newPepole("小丽", JOB.LAWYER, SEX.WOMEN); List<Pepole> lstP = new ArrayList<Pepole>(); lstP.add(pa);lstP.add(pb);lstP.add(pc);lstP.add(pd);lstP.add(pe);lstP.add(pf); //定义六个人的关系,将有亲缘关系的放入一个关系集合,根据题意存在两组亲缘关系集合. List<Pepole> lstRelation1 = new ArrayList<Pepole>(); lstRelation1.add(pa); lstRelation1.add(pc); lstRelation1.add(pe); List<Pepole> lstRelation2 = new ArrayList<Pepole>(); lstRelation2.add(pb); lstRelation2.add(pd); lstRelation2.add(pf); Relation.pepoles.add(lstRelation1); Relation.pepoles.add(lstRelation2); for(Pepole pModerer:lstP){//遍历可能的凶手 for(Pepole pDead:lstP){//遍历可能的受害人 //6个条件按顺序氛围三组是否满足的标记. boolean flag12 = false; boolean flag34 = false; boolean flag56 = false; boolean flagRela = false;//是否有亲缘关系 boolean flagJob = false;//是否同职业 boolean flagSex = false;//是否同性别 if(pModerer.equals(pDead)) continue;//去掉自杀现象 //判断是否有亲缘关系 for(List<Pepole> lstRela:Relation.pepoles){ //如果两人属于任何一个亲缘关系集合,则有亲缘关系. if (lstRela.containsAll(Arrays.asList(pModerer,pDead))) { flagRela = true; break; } } //判断是否满足条件一或二 if(flagRela && pModerer.sex.equals(SEX.MAN)){flag12 = true;} if(!flagRela && pModerer.job.equals(JOB.DOCTOR)){flag12 = true;} //判断是否职业相同 if(pModerer.job.equals(pDead.job)) flagJob = true; //判断条件3,4是否成立 if(flagJob && pDead.sex.equals(SEX.MAN)){flag34 = true;} if(!flagJob && pDead.sex.equals(SEX.WOMEN)){flag34 = true;} //判断是否性别相同 if(pModerer.sex.equals(pDead.sex)) flagSex = true; //判断条件5,6是否成立 if(flagSex && pDead.job.equals(JOB.DOCTOR)){flag56 = true;} if(!flagSex && pModerer.job.equals(JOB.LAWYER)){flag56 = true;} if(flag12 && flag34 && flag56){//所有条件满足退出查找,输出结果. System.out.println("凶手是:" + pModerer); System.out.println("受害人是:" + pDead); // return; } } } } }
输出结果为:
凶手是:小阳
受害人是:小刚
凶手是:小刚
受害人是:小阳