刑侦推理试卷答案【code by JAVA】


最近网上疯传的一张‘刑侦科推理试卷’让不少小伙伴对自己的智商产生怀疑。当看到这张试卷时,想必大家都兴奋的跃跃欲试,我在尝试了半小时后,写了一大堆草稿,脑袋已成浆糊。不过作为程序猿,自然有独特的打开方式,人脑处理不了,咱们用电脑。10道题4个待选项,用穷举的话最不济运算4^10次,也就100万出头,对于计算机来说小case。以下是代码


import java.util.ArrayList;
import java.util.Collections;
/**
 * Created by Huberry on 2018/3/5.
 */
public class Test {
    public static void main(String[] args){
        exhaustion();
    }
    private static  char[] aList = {'A', 'B', 'C', 'D'};
    private static void exhaustion(){
        int checkCount = 0;
        for(char a1 : aList){
            for(char a2 : aList){
                for(char a3 : aList){
                    for(char a4 : aList){
                        for(char a5 : aList){
                            for(char a6 : aList){
                                for(char a7 : aList){
                                    for(char a8 : aList){
                                        for(char a9 : aList){
                                            for(char a10 : aList){
                                                ArrayList<Character> answers = new ArrayList<>();
                                                answers.add(a1);
                                                answers.add(a2);
                                                answers.add(a3);
                                                answers.add(a4);
                                                answers.add(a5);
                                                answers.add(a6);
                                                answers.add(a7);
                                                answers.add(a8);
                                                answers.add(a9);
                                                answers.add(a10);
												
                                                checkCount++;
                                                if(check(answers)){
                                                    System.out.println("checkCount_"+checkCount);
													return;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    private static boolean check(ArrayList<Character> answers){
        char a1 = answers.get(0);
        char a2 = answers.get(1);
        char a3 = answers.get(2);
        char a4 = answers.get(3);
        char a5 = answers.get(4);
        char a6 = answers.get(5);
        char a7 = answers.get(6);
        char a8 = answers.get(7);
        char a9 = answers.get(8);
        char a10 = answers.get(9);

        // 第三题 哪个与其他三个不同  3 6 2 4
        switch (a3){
            case 'A':
                if(!(a3!=a6 && a3!=a2 && a3!=a4))
                    return false;
                break;
            case 'B':
                if(!(a6!=a3 && a6!=a2 && a6!=a4))
                    return false;
                break;
            case 'C':
                if(!(a2!=a6 && a2!=a3 && a2!=a4))
                    return false;
                break;
            case 'D':
                if(!(a4!=a3 && a4!=a2 && a6!=a4))
                    return false;
                break;
        }

        // 第四题 哪两题相同 15 27 19 6,10
        switch (a4){
            case 'A':
                if(!(a1==a5 && a2!=a7 && a1!=a9 && a6!=a10))
                    return false;
				break;
            case 'B':
                if(!(a1!=a5 && a2==a7 && a1!=a9 && a6!=a10))
                    return false;
				break;
            case 'C':
                if(!(a1!=a5 && a2!=a7 && a1==a9 && a6!=a10))
                    return false;
				break;
            case 'D':
                if(!(a1!=a5 && a2!=a7 && a1!=a9 && a6==a10))
                    return false;
				break;
        }

        // 第五题 哪题与本题相同 8 4 9 7
        switch (a5){
            case 'A':
                if(!(a5==a8 && a5!=a4 && a5!=a9 && a5!=a7))
                    return false;
				break;
            case 'B':
                if(!(a5!=a8 && a5==a4 && a5!=a9 && a5!=a7))
                    return false;
				break;
            case 'C':
                if(!(a5!=a8 && a5!=a4 && a5==a9 && a5!=a7))
                    return false;
				break;
            case 'D':
                if(!(a5!=a8 && a5!=a4 && a5!=a9 && a5==a7))
                    return false;
				break;
        }

        // 第六题 哪两题与第八题相同 24 16 3,10 59
        switch (a6){
            case 'A':
                if(!((a8==a2 && a8==a4) && (a8!=a1 || a8!=a6) && (a8!=a3 || a8!=a10) && (a8!=a5 || a8!=a9)))
                    return false;
				break;
            case 'B':
                if(!((a8!=a2 || a8!=a4) && (a8==a1 && a8==a6) && (a8!=a3 || a8!=a10) && (a8!=a5 || a8!=a9)))
                    return false;
				break;
            case 'C':
                if(!((a8!=a2 || a8!=a4) && (a8!=a1 || a8!=a6) && (a8==a3 && a8==a10) && (a8!=a5 || a8!=a9)))
                    return false;
				break;
            case 'D':
                if(!((a8!=a2 || a8!=a4) && (a8!=a1 || a8!=a6) && (a8!=a3 || a8!=a10) && (a8==a5 && a8==a9)))
                    return false;
				break;
        }

		int countA = Collections.frequency(answers, 'A');
        int countB = Collections.frequency(answers, 'B');
        int countC = Collections.frequency(answers, 'C');
        int countD = Collections.frequency(answers, 'D');
        ArrayList<Integer> counts = new ArrayList<>();
        counts.add(countA);
        counts.add(countB);
        counts.add(countC);
        counts.add(countD);
        int countMin = Collections.min(counts);
        int countMax = Collections.max(counts);

        // 第七题 被选中最少的 C B A D
        switch (a7){
            case 'A':
                if(!(countC == countMin))
                    return false;
				break;
            case 'B':
                if(!(countB == countMin))
                    return false;
				break;
            case 'C':
                if(!(countA == countMin))
                    return false;
				break;
            case 'D':
                if(!(countD == countMin))
                    return false;
				break;
        }

        // 第八题 哪一题与第一题不相邻 7 5 2 10
        int asc1 = (int)a1;
        switch (a8){
            case 'A':
                if(!(Math.abs(asc1-(int)a7)!=1 && Math.abs(asc1-(int)a5)==1 && Math.abs(asc1-(int)a2)==1 && Math.abs(asc1-(int)a10)==1))
                    return false;
				break;
            case 'B':
                if(!(Math.abs(asc1-(int)a7)==1 && Math.abs(asc1-(int)a5)!=1 && Math.abs(asc1-(int)a2)==1 && Math.abs(asc1-(int)a10)==1))
                    return false;
				break;
            case 'C':
                if(!(Math.abs(asc1-(int)a7)==1 && Math.abs(asc1-(int)a5)==1 && Math.abs(asc1-(int)a2)!=1 && Math.abs(asc1-(int)a10)==1))
                    return false;
				break;
            case 'D':
                if(!(Math.abs(asc1-(int)a7)==1 && Math.abs(asc1-(int)a5)==1 && Math.abs(asc1-(int)a2)==1 && Math.abs(asc1-(int)a10)!=1))
                    return false;
				break;
        }

        // 第9题 1=6和x=5真假相反 6 10 2 9
        boolean same1_6 = a1==a6;
        switch (a9){
            case 'A':
                if(!((same1_6 != (a5==a6)) && (same1_6 == (a5==a10)) && (same1_6 == (a5==a2)) && (same1_6 == (a5==a9))))
                    return false;
				break;
            case 'B':
                if(!((same1_6 == (a5==a6)) && (same1_6 != (a5==a10)) && (same1_6 == (a5==a2)) && (same1_6 == (a5==a9))))
                    return false;
				break;
            case 'C':
                if(!((same1_6 == (a5==a6)) && (same1_6 == (a5==a10)) && (same1_6 != (a5==a2)) && (same1_6 == (a5==a9))))
                    return false;
				break;
            case 'D':
                if(!((same1_6 == (a5==a6)) && (same1_6 == (a5==a10)) && (same1_6 == (a5==a2)) && (same1_6 != (a5==a9))))
                    return false;
				break;
        }

        // 第十题 答案出现最多的和最少的差值 3 2 4 1
        switch (a10){
            case 'A':
                if(!(countMax-countMin == 3))
                    return false;
				break;
            case 'B':
                if(!(countMax-countMin == 2))
                    return false;
				break;
            case 'C':
                if(!(countMax-countMin == 4))
                    return false;
				break;
            case 'D':
                if(!(countMax-countMin == 1))
                    return false;
				break;
        }
        System.out.println("1"+a1+ "_2"+a2+ "_3"+a3+ "_4"+a4+ "_5"+a5+ "_6"+a6+ "_7"+a7+ "_8"+a8+ "_9"+a9+ "_10"+a10);
        return true;
    }
}


运行结果:

可见试了40W次出来正确答案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值