• 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

      

      

  • 相关阅读:
    1142
    dbms_monitor开启/关闭会话跟踪
    mysql密码过期问题
    zabbix监控mysql
    12C -- ORA-65048 ORA-65048
    idea的快捷键
    IntelliJ IDEA的配置优化
    IDEA环境设置
    Java 中int、String的类型转换
    js数组去重
  • 原文地址:https://www.cnblogs.com/haimishasha/p/8565922.html
Copyright © 2020-2023  润新知