2018年刑侦科目推理试题

摘录自:http://blog.csdn.net/akmissxt/article/details/79463632

问题描述:

  

问题分析:

     1. 推理

     2. 编程方法,暴力破解

推理办法:

  第一题,废题

  第二题,开始依次试第二题的答案

      2A---》5C--->9C---->1==6; 3[A|B|C|D](X)

      2B---》5D--->7D---->A,B,C,D>=2;  3A--->4B---->6B----->7B(X)

                       3B---->2B---->4B----->7B(X)      

                       3[C|D](X)

      2C---》5A--->8A; 3[B|C|D](X)

              3A---->4C---->6C---->1==9---->10A;  //此时只有1,7,9没有确认

                                 7[A|C](X)     //第七题最少的字母应该是B和D

                                 7B----->1D---->9D(X)   //7的答案与1不相邻

                                 7D----->1A----->9A(X)  //不满足第九题

                                              1B----->9B(YES)

      最终的答案整理得 【B,C,A,C,A,C,D,A,B,A】      

程序如下: 

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * 题目:如何看待2018年刑侦科推理试题
 * 解法:穷举法。生成所有可能的答案组合(共1<<20种组合),将2-10题目作为筛选条件(第1题没有信息量)
 * @author Hello stranger
 *
 */
public class Reasoning {
    
    /**
     * 生成数组
     * @param set
     */
    public static void generate(Set set){
        //1号位
        for (int b = 1; b < 5; b++) {
            //2
            for (int c = 1; c < 5; c++) {
                //3
                for (int d = 1; d < 5; d++) {
                    //4
                    for (int e = 1; e < 5; e++) {
                        //5
                        for (int f = 1; f < 5; f++) {
                            //6
                            for (int g = 1; g < 5; g++) {
                                //7
                                for (int h = 1; h < 5; h++) {
                                    //8
                                    for (int i = 1; i < 5; i++) {
                                        //9
                                        for (int j = 1; j < 5; j++) {
                                            //10
                                            for (int k = 1; k < 5; k++) {
                                                int[] a = new int[11];
                                                a[0] = 1;//判断是否符号条件标识位
                                                    put(a,1,b);
                                                    put(a,2,c);
                                                    put(a,3,d);
                                                    put(a,4,e);
                                                    put(a,5,f);
                                                    put(a,6,g);
                                                    put(a,7,h);
                                                    put(a,8,i);
                                                    put(a,9,j);
                                                    put(a,10,k);
                                                set.add(a);
                                            }
                                            
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                
            }
        }
    }
    
    /**
     * 
     * @param arr 数组
     * @param y      数组下标
     * @param x     数组的值(1、2、3、4 对应A、B、C、D)
     */
    public static void put(int[] a,int y,int x){
        a[y] = x;
    }
    
    //第二题
    public static void second(int[] a){
        if(a[5] == 3 && a[2] == 1){}
        else if(a[5] == 4 && a[2] == 2){}
        else if(a[5] == 1 && a[2] == 3){}
        else if(a[5] == 2 && a[2] == 4){}
        else{
            a[0] = 0;
        }
    }
    
    //第三题
    public static void third(int[] a){
        if(a[2]==a[3] && a[3]==a[4] && a[3]!=a[6] && a[3] == 2){}//234答案相同
        else if(a[2]==a[3] && a[3]==a[6] && a[3]!=a[4] && a[3] == 4){}//236答案相同
        else if(a[2]==a[4] && a[4]==a[6] && a[4]!=1 && a[3] == 1){}//246答案相同
        else if(a[3]==a[4] && a[4]==a[6] && a[3]!=a[2] && a[3] == 3){}//346答案相同
        else{//不符合条件
            a[0] = 0;
        }
    }
    
    //第四题
    public static void fourth(int[] a){
        if(a[1] == a[5] && a[4] == 1){}
        else if(a[2] == a[7] && a[4] == 2){}
        else if(a[1] == a[9] && a[4] == 3){}
        else if(a[6] == a[10] && a[4] == 4){}
        else{
            a[0] = 0;
        }
    }
    
    //第五题
    public static void fifth(int[] a){
        if(a[5] == a[8] && a[5] == 1 ){}
        else if(a[5] == a[4] && a[5] == 2){}
        else if(a[5] == a[9] && a[5] == 3){}
        else if(a[5] == a[7] && a[5] == 4){}
        else{
            a[0] = 0;
        }
    }
    
    //第六题
    public static void sixth(int[] a){
        if(a[2] == a[8] && a[4] == a[8] && a[6] == 1 ){}
        else if(a[1] == a[8] && a[6] == a[8] && a[6] == 2){}
        else if(a[3] == a[8] && a[10] == a[8] && a[6] == 3){}
        else if(a[5] == a[8] && a[9] == a[8] && a[6] == 4){}
        else{
            a[0] = 0;
        }
    }
    
    //第七题 
    //这10题中被选中次数最少的
    public static void seventh(int[] a){
        int min = count(a, "min");
        if(min == 1 && a[7] == 3){}
        else if(min == 2 && a[7] == 2){}
        else if(min == 3 && a[7] == 1){}
        else if(min == 4 && a[7] == 4){}
        else{
            a[0] = 0;
        }
            
    }
    
    //第八题
    public static void eighth(int[] a){
        if(a[1]-1 != a[7] || a[1]+1 != a[7] && a[8] == 1){}
        else if(a[1]-1 != a[5] || a[1]+1 != a[5] && a[8] == 2){}
        else if(a[1]-1 != a[2] || a[1]+1 != a[2] && a[8] == 3){}
        else if(a[1]-1 != a[10] || a[1]+1 != a[10] && a[8] == 4){}
        else{
            a[0] = 0;
        }
    }
    
    //第九题
    public static void nineth(int[] a){
        if(a[1] == a[6]){
            if(a[6] != a[5] && a[9] == 1){}
            else if(a[10] != a[5] && a[9] == 2){}
            else if(a[2] != a[5] && a[9] == 3){}
            else if(a[9] != a[5] && a[9] == 4){}
            else{
                a[0] = 0;
            }
        }else{
            if(a[6] == a[5]  && a[9] == 1){}
            else if(a[10] == a[5]  && a[9] == 2){}
            else if(a[2] == a[5]  && a[9] == 3){}
            else if(a[9] == a[5]  && a[9] == 4){}
            else{
                a[0] = 0;
            }
        }
    }
    
    //第十题
    public static void tenth(int[] a){
        int sub = count(a, "sub");
         if(sub == 3 && a[10] == 1){}
            else if(sub == 2 && a[10] == 2){}
            else if(sub == 4 && a[10] == 3){}
            else if(sub == 1 && a[10] == 4){}
            else{
                a[0] = 0;
            }
    }
    
    
    /**
     * TODO:统计返回最大出现次数与最小出现次数的差,或返回出现次数最小的选项
     * @param a 数组
     * @param m "sub"返回次数差,否则返回出现次数最小的选项
     * @return
     */
    public static int count(int[] a,String m){
        int[] num = new int[5];
        for(int i=1; i<11; i++){
            if(a[i] == 1){
                num[1] ++;
            }
            else if(a[i] == 2){
                num[2]++;
            }
            else if(a[i] == 3){
                num[3]++;
            }
            else{
                num[4]++;
            }
        }
        int max = Math.max(num[1], 
                    Math.max(num[2], 
                        Math.max(num[3], num[4])));
        int min = Math.min(num[1], 
                    Math.min(num[2], 
                        Math.min(num[3], num[4])));
        if("sub".equals(m)){
            return max - min;
        }else{
            if(min == num[1]){
                return 1;
            }else if(min == num[2]){
                return 2;
            }else if(min == num[3]){
                return 3;
            }else{
                return 4;
            }
        }
        
    }
    
    public static void main(String[] args) {
        int num = 0;
        HashSet<int[]> set = new HashSet<int[]>();
        generate(set);
        for(int[] a : set){
            second(a);
            third(a);
            fourth(a);
            fifth(a);
            sixth(a);
            seventh(a);
            eighth(a);
            nineth(a);
            tenth(a);
            //输出符合条件的答案
            if(a[0] == 1){
                for(int j : Arrays.copyOfRange(a, 1, a.length)){
                    char result = '0';
                    if(j==1) {
                        result = 'A';
                    }else if(j==2) {
                        result = 'B';
                    }else if(j==3) {
                        result = 'C';
                    }else if(j==4) {
                        result = 'D';
                    }
                    System.out.print(result+",");
                }
                System.out.println();
            }
        }
    }
}

   结果:B,C,A,C,A,C,D,A,B,A

  

  

原文地址:https://www.cnblogs.com/haimishasha/p/8565922.html