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

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

微信圖片_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ù)的選項相關(guān)計算
        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();
    }

運行結(jié)果:

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

轉(zhuǎn)化成答案是:

B、C晴裹、A被济、C、A
C涧团、D只磷、A经磅、B、A

總結(jié):

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轧叽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惠毁,更是在濱河造成了極大的恐慌犹芹,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞠绰,死亡現(xiàn)場離奇詭異腰埂,居然都是意外死亡,警方通過查閱死者的電腦和手機蜈膨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門屿笼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翁巍,你說我怎么就攤上這事驴一。” “怎么了灶壶?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵肝断,是天一觀的道長。 經(jīng)常有香客問我驰凛,道長胸懈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任恰响,我火速辦了婚禮趣钱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胚宦。我一直安慰自己首有,他們只是感情好,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布枢劝。 她就那樣靜靜地躺著井联,像睡著了一般。 火紅的嫁衣襯著肌膚如雪您旁。 梳的紋絲不亂的頭發(fā)上烙常,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天,我揣著相機與錄音被冒,去河邊找鬼军掂。 笑死,一個胖子當著我的面吹牛昨悼,可吹牛的內(nèi)容都是我干的蝗锥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼率触,長吁一口氣:“原來是場噩夢啊……” “哼终议!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起葱蝗,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤穴张,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后两曼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皂甘,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年悼凑,在試婚紗的時候發(fā)現(xiàn)自己被綠了偿枕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡户辫,死狀恐怖渐夸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渔欢,我是刑警寧澤墓塌,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站奥额,受9級特大地震影響苫幢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜披坏,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一态坦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棒拂,春花似錦伞梯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至攻旦,卻和暖如春喻旷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牢屋。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工且预, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留槽袄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓锋谐,卻偏偏與公主長得像遍尺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子涮拗,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容

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