java代碼解“2018年刑偵科推理試題”

這段時間各種社交群和朋友圈火起來一個刑偵推理題,這是 3月1日“@江蘇網(wǎng)警”在微博上發(fā)布了一套試題??戳藘裳塾X得推理太麻煩,試試代碼群舉出答案看看。原題如圖

微信圖片_20180303124123.jpg

一些簡單的可行性分析
10道題,每個題四個群舉次數(shù)4的10次方。雖然時間復雜度O(n^10) 還好n是4。0.0迷之尷尬……

java代碼

    public static void answer(){
        //用1234分別對應ABCD,計算方便
        int[] answers = {1,2,3,4};
        //群舉答案
        for (int q1 : answers) {
            for (int q2 : answers) {
                for (int q3 : answers) {
                    for (int q4 : answers) {
                        for (int q5 : answers) {
                            for (int q6 : answers) {
                                for (int q7 : answers) {
                                    for (int q8 : answers) {
                                        for (int q9 : answers) {
                                            for (int q10 : answers) {
                                                int[] questions = new int[10];
                                                questions[0] = q1;
                                                questions[1] = q2;
                                                questions[2] = q3;
                                                questions[3] = q4;
                                                questions[4] = q5;
                                                questions[5] = q6;
                                                questions[6] = q7;
                                                questions[7] = q8;
                                                questions[8] = q9;
                                                questions[9] = q10;
                                                if (isEnd(questions)){
                                                    //遍歷輸出符合條件的答案
                                                    for (int i = 0 ; i < 10; i++){
                                                        System.out.println((i+1) + ":" + questions[i]);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    /**
     *判斷每個答案是否符合題意
     *為了方便questions數(shù)組中從0開始,
     *題目比數(shù)組角標多1(不要問為什么,奏是這么開)
     *比如question[0] 的值表示第1題答案
     **/
    static boolean isEnd(int[] questions){
        //第二題,第5題的答案是
        switch (questions[4]){
            case 1:
                //如果第5題答案是A,判斷第2題答案是不是C。不是返回false,是繼續(xù)
                if(questions[1] != 3)
                    return false;
                break;
            case 2:
                //原理同上
                if(questions[1] != 4)
                    return false;
                break;
            case 3:
                //原理同上
                if(questions[1] != 1)
                    return false;
                break;
            case 4:
                //原理同上
                if(questions[1] != 2)
                    return false;
                break;
        }
        //第3題,以下選項中哪一題的答案與其他三項不同
        switch (questions[2]){
            case 1:
                if(!(questions[2]!=questions[5] && questions[5]==questions[1] && questions[1] == questions[3]))
                    return false;
                break;
            case 2:
                if(!(questions[5]!=questions[2] && questions[2]==questions[1] && questions[1] == questions[3]))
                    return false;
                break;
            case 3:
                if(!(questions[1]!=questions[5] && questions[2]==questions[5] && questions[5] == questions[3]))
                    return false;
                break;
            case 4:
                if(!(questions[3]!=questions[5] && questions[5]==questions[1] && questions[1] == questions[2]))
                    return false;
                break;
        }
        //第4題,以下選項中那兩題的答案相同
        switch (questions[3]){
            case 1:{
                //判斷第1題與第5題答案是否相同
                if (questions[0] != questions[4]){
                    return  false;
                }
                break;
            }
            case 2:{
                //原理同上
                if (questions[1] != questions[6]){
                    return  false;
                }
                break;
            }
            case 3:{
                //原理同上
                if (questions[0] != questions[8]){
                    return  false;
                }
                break;
            }
            case 4:{
                //原理同上
                if (questions[5] != questions[9]){
                    return  false;
                }
                break;
            }
        }
        //第5題,以下選項中哪一題的答案與本題相同
        switch (questions[4]){
            case 1:
                //判斷第8題答案是否是A
                if (questions[7] != 1)
                    return  false;
                break;
            case 2:
                //原理同上
                if(questions[3] != 2)
                    return  false;
                break;
            case 3:
                //原理同上
                if (questions[8] != 3)
                    return false;
            case 4:
                //原理同上
                if (questions[6] != 4)
                    return  false;
                break;
        }
        //第6題,以下選項中哪兩題的答案與第8題相同
        switch (questions[5]){
            case 1:
                //判斷第1、4題答案是否與第8題答案相同
                if(questions[1] != questions[7] || questions[4] != questions[7])
                    return  false;
                break;
            case 2:
                //原理同上
                if(questions[0] != questions[7] || questions[5] != questions[7])
                    return  false;
                break;
            case 3:
                //原理同上
                if(questions[2] != questions[7] || questions[9] != questions[7])
                    return  false;
                break;
            case 4:
                //原理同上
                if(questions[4] != questions[7] || questions[8] != questions[7])
                    return  false;
                break;
        }
        //由于第7、10題問題是同類型的,所以一塊計算 。start
        int[] check10 = new int[5];
        //把每個題的答案(1、2、3、4)作為新數(shù)組下表,value++計算出現(xiàn)次數(shù)
        for (int i=0;i < questions.length;i++){
            check10[questions[i]]++;
        }
        //出現(xiàn)最少與最多選項的次數(shù)初始化為A的次數(shù)
        int low = check10[1];
        int longer = check10[1];
        //出現(xiàn)最少的選項,初始化為A
        int lowA = 1;
        //最少與最多次數(shù)的選項相關計算
        for (int i=1;i<5;i++) {
            if(check10[i] >0 && check10[i] < low){
                low = check10[i];
                lowA = i;
            }
            if (check10[i] > longer){
                longer = check10[i];
            }
        }

        //第7題,在此十道題中,被選中次數(shù)最少的選項字母為
        switch (questions[6]){
            case 1:
                //判斷才出現(xiàn)最少的字母是否為C
                if (lowA != 3)
                    return  false;
                break;
            case 2:
                //原理同上
                if (lowA != 2)
                    return  false;
                break;
            case 3:
                //原理同上
                if (lowA != 1)
                    return  false;
                break;
            case 4:
                //原理同上
                if (lowA != 4)
                    return  false;
                break;
        }
        //第10題,在此10道題中,ABCD四個字母出現(xiàn)次數(shù)最多與最少者的差為
        //最多次數(shù)與最少次數(shù)的差值
        int t = longer-low;
        switch (questions[9]){
            case 1:
                //判斷差值是否為3
                if (t != 3)
                    return  false;
                break;
            case 2:
                //原理同上
                if (t != 2)
                    return  false;
                break;
            case 3:
                //原理同上
                if (t != 4)
                    return  false;
                break;
            case 4:
                //原理同上
                if (t != 1)
                    return  false;
                break;
        }
        //第7、10 題校驗end
        //第8題,以下選項中哪一題的答案與第1題的答案在字母中不相鄰
        switch (questions[7]) {
            case 1:
                //判斷第7題與第一題答案差值絕對是是否為1
                if (Math.abs(questions[6] - questions[0]) == 1)
                    return false;
                break;
            case 2:
                //原理同上
                if (Math.abs(questions[4] - questions[0]) == 1)
                    return false;
                break;
            case 3:
                //原理同上
                if (Math.abs(questions[1] - questions[0]) == 1)
                    return false;
                break;
            case 4:
                //原理同上
                if (Math.abs(questions[9] - questions[0]) == 1)
                    return false;
                break;

        }
        //第9題,已知“第1題與第6題的答案相同”與“第X題與第5題的答案相同”的真假性相反,那么X為
        //判斷第1題與第6題的答案是否相同
        boolean isOne = questions[0]==questions[5]?true:false;
        switch (questions[8]){
            case 1:
                if(isOne){
                    //第1題與第6題相同,第6題與第5題答案相同返回false;
                    if (questions[5] == questions[4])
                        return false;
                }else {
                    //第1題與第6題不相同,第6題與第5題答案不相同返回false;
                    if (questions[5] != questions[4])
                        return false;
                }
                break;
            case 2:
                //原理同上
                if(isOne){
                    if (questions[9] == questions[4])
                        return false;
                }else {
                    if (questions[9] != questions[4])
                        return false;
                }
                break;
            case 3:
                //原理同上
                if(isOne){
                    if (questions[1] == questions[4])
                        return false;
                }else {
                    if (questions[1] != questions[4])
                        return false;
                }
                break;
            case 4:
                //原理同上
                if(isOne){
                    if (questions[8] == questions[4])
                        return false;
                }else {
                    if (questions[8] != questions[4])
                        return false;
                }
                break;
        }
        return true;
    }

    public static void main(String[] args) {
        answer();
    }

運行結果:

1:2
2:3
3:1
4:3
5:1
6:3
7:4
8:1
9:2
10:1

轉化成答案是:

B、C、A、C、A
C、D、A、B、A

總結:

這個方法只適合題個數(shù)少的,如果題目較多則需要考慮多線程解決。類似的推理題由于解題需要順序,所以硬編碼方法只能用群舉的方案。暫時只能想到這了,如果那位大神有更好的方案歡迎交流

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 高級鉗工應知鑒定題庫(858題) ***單選題*** 1. 000003難易程度:較難知識范圍:相關4 01答案:...
    開源時代閱讀 6,294評論 1 9
  • 很羨慕那些長胳膊長腿,瘦且特別有氣質的人,在我眼里,這簡直就是老天爺賜予他們的禮物。然而,今天看了一個這樣姑娘的自...
    Vivian_n閱讀 184評論 0 0
  • 我的班上有一個學生M,是一個低年級的小男生。乍一看上去是個陽光小暖男。但是,接觸的時間久了,就覺得這個小男生...
    余沅芮閱讀 248評論 0 0
  • 上班了六天今天好不容易可以休息本以為可以好好去玩的。敗給了要去辦銀行卡要去辦健康證。八點出門火辣辣的曬得有點微微頭...
    Tinamo閱讀 219評論 0 0
  • 無論如何,新聞的傳播速度,在當下是飛速的,在網(wǎng)路發(fā)達的今天,想要遮蓋或者隱瞞,基本是徒勞的,只有事發(fā)之后的解釋和處...
    cc08閱讀 324評論 0 0

友情鏈接更多精彩內容