2018年刑侦科推理试题(C++)

上学期看到2018年刑侦科推理试题,直觉告诉我可以嵌套N层for循环来解答,但后面还是用组合算法穷举出所有组合算到答案,嵌套太深不好搞啊。

0b00000000000000000000 自增到 0b11111111111111111111,每2bit表示一道题的答案,即: 0b00为A,0b01为B,0b10为C,0b11为D,

利用位移操作从左边高位依次读取每2bit的数,判断后不符合题意的组合就扔掉,最终肯定有一个组合答案符合。

下面我自己的解法


//
// Created by sys234 on 4/3/2018.
//
#include <vector>
#include <iostream>
#include <map>
#include <ctime>

using namespace std;
const unsigned int A = 0;
const unsigned int B = 1;
const unsigned int C = 2;
const unsigned int D = 3;

vector<unsigned int> getAnswerLine(unsigned int num) {
    vector<unsigned int> answer;
    for (unsigned int j = 0; j < 20; j += 2) {
        //offset 2bit
        unsigned int x = ((num << (32 - 2 - j)) >> 30);
        answer.push_back(x);
    }
    return answer;
}

bool isTheSame(int qnum, int qans) {
    return qnum == qans;
}

bool notTheSame(int qnum, int qans) {
    return qnum != qans;
}

bool isNear(int qans1, int qans2) {
    return abs(qans1 - qans2) == 1;
}

unsigned int getAnsAppearTimes(const vector<unsigned int> &alls, int max = -1, bool retAsTimes = false) {
    map<unsigned int, int> stat;
    for (auto item : alls) {
        int val = item;
        ++stat[val];
    }
    int minAns = 0;//supposing A
    int qTimes = 0;
    auto pair1 = stat.find(0);
    minAns = 0;
    qTimes = pair1->second;
    for (int i = 1; i < 4; ++i) {
        pair1 = stat.find(i);
        if (qTimes > pair1->second && -1 == max) {
            minAns = pair1->first;
            qTimes = pair1->second;
            continue;
        }
        if (qTimes < pair1->second && -1 != max) {
            minAns = pair1->first;
            qTimes = pair1->second;
            continue;
        }
    }

    if (retAsTimes == false) {
        return minAns;
    }
    return qTimes;

}

unsigned int getAnsNumTimes(const vector<unsigned int> &alls, int max = -1) {
    return getAnsAppearTimes(alls, max, true);
}

char echoAns(int n) {
    switch (n) {
        case 0:
            return ‘A‘;
        case 1:
            return ‘B‘;
        case 2:
            return ‘C‘;
        case 3:
            return ‘D‘;
        default:
            return ‘\0‘;
    }
}

vector<unsigned int> getAnswerLine(unsigned int num);

void combination() {
    unsigned int ansMax = 0b11111111111111111111;//note: 20/2=10 ,2bit presents a answer;A=>00,B=>01,C=>10,D=>11
    unsigned int ansMin = 0b0;
    unsigned int i;
    for (i = 0; i <= ansMax; ++i) {
        vector<unsigned int> one = getAnswerLine(i);

        unsigned int q1 = one[0], q2 = one[1], q3 = one[2], q4 = one[3], q5 = one[4], q6 = one[5], q7 = one[6], q8 = one[7], q9 = one[8], q10 = one[9];

        if (q1 == q2 && q1 == q3 && q1 == q4 && q1 == q5 && q1 == q6 && q1 == q7 && q1 == q8 && q1 == q9 && q1 == q10) {
            //excluding all the same answer
            continue;
        }
        if (isTheSame(q2, A) && notTheSame(q5, C)
            || isTheSame(q2, B) && notTheSame(q5, D)
            || isTheSame(q2, C) && notTheSame(q5, A)
            || isTheSame(q2, D) && notTheSame(q5, B)) {
            continue;
            //excluding 2nd
        }
        if (isTheSame(q3, A) && isTheSame(q3, q6)
            || isTheSame(q3, A) && isTheSame(q3, q2)
            || isTheSame(q3, A) && isTheSame(q3, q4)
            //
            || isTheSame(q3, B) && isTheSame(q3, q6)
            || isTheSame(q3, B) && isTheSame(q6, q2)
            || isTheSame(q3, B) && isTheSame(q6, q4)
            //
            || isTheSame(q3, C) && isTheSame(q3, q2)
            || isTheSame(q3, C) && isTheSame(q6, q2)
            || isTheSame(q3, C) && isTheSame(q2, q4)
            //
            || isTheSame(q3, D) && isTheSame(q3, q4)
            || isTheSame(q3, D) && isTheSame(q6, q4)
            || isTheSame(q3, D) && isTheSame(q2, q4)
                ) {

            continue;
            //excluding 3rd
        }
        if (isTheSame(q4, A) && notTheSame(q1, q5)
            || isTheSame(q4, B) && notTheSame(q2, q7)
            || isTheSame(q4, C) && notTheSame(q1, q9)
            || isTheSame(q4, D) && notTheSame(q6, q10)) {
            continue;
            //excluding4
        }
        if (isTheSame(q5, A) && notTheSame(q8, A)
            || isTheSame(q5, B) && notTheSame(q4, B)
            || isTheSame(q5, C) && notTheSame(q9, C)
            || isTheSame(q5, D) && notTheSame(q7, D)) {
            continue;
            //excluding 5
        }
        if (isTheSame(q6, A) && (notTheSame(q2, q8) || notTheSame(q4, q8))
            || isTheSame(q6, B) && (notTheSame(q1, q8) || notTheSame(q6, q8))
            || isTheSame(q6, C) && (notTheSame(q3, q8) || notTheSame(q10, q8))
            || isTheSame(q6, D) && (notTheSame(q5, q8) || notTheSame(q9, q8))
                ) {
            continue;
            //excluding 6
        }
        int selectedLeastAlpha = getAnsAppearTimes(one, -1);
        if (isTheSame(q7, A) && notTheSame(selectedLeastAlpha, C)
            || isTheSame(q7, B) && notTheSame(selectedLeastAlpha, B)
            || isTheSame(q7, C) && notTheSame(selectedLeastAlpha, A)
            || isTheSame(q7, D) && notTheSame(selectedLeastAlpha, D)
                ) {
            continue;
            //excluding 7
        }

        if (isTheSame(q8, A) && isNear(q1, q7)
            || isTheSame(q8, B) && isNear(q1, q5)
            || isTheSame(q8, C) && isNear(q1, q2)
            || isTheSame(q8, D) && isNear(q1, q10)
                ) {
            continue;
            //excluding 8
        }

        if (isTheSame(q9, A) && isTheSame(q1, q6) && isTheSame(q6, q5)
            || isTheSame(q9, A) && notTheSame(q1, q6) && notTheSame(q6, q5)
            //
            || isTheSame(q9, B) && isTheSame(q1, q6) && isTheSame(q10, q5)
            || isTheSame(q9, B) && notTheSame(q1, q6) && notTheSame(q10, q5)
            //
            || isTheSame(q9, C) && isTheSame(q1, q6) && isTheSame(q2, q5)
            || isTheSame(q9, C) && notTheSame(q1, q6) && notTheSame(q2, q5)
            //
            || isTheSame(q9, D) && isTheSame(q1, q6) && isTheSame(q9, q5)
            || isTheSame(q9, D) && notTheSame(q1, q6) && notTheSame(q9, q5)
            //
                ) {
            continue;
            //excluding 9th
        }
        int optionsCountMax = getAnsNumTimes(one, 1);
        int optionsCountMin = getAnsNumTimes(one, -1);
        int diff = optionsCountMax - optionsCountMin;

        if (isTheSame(q10, A) && 3 != diff
            || isTheSame(q10, B) && 2 != diff
            || isTheSame(q10, C) && 4 != diff
            || isTheSame(q10, D) && 1 != diff
                ) {
            continue;
            //exclusing 10th
        }
        //print answer
        for (int lastAns : one) {
            cout << echoAns(lastAns)<<" ";
        }
        cout << endl;

    }
}

int main() {
    std::cout << clock() << std::endl;
    combination();
    std::cout << clock() << std::endl;
    return 0;
}

解题中少了几个过滤条件,打印除算出好几行答案,差点以为我解法写错了,然后搜索到其他网友的答案,提有意思了,有嵌套多层for循环生成组合的。

有用4进制组合答案,多种语言好多技巧,学习了...

最终把缺少过滤条件判断加上去就OK了。

原文地址:https://www.cnblogs.com/fjfj/p/9696327.html

时间: 2024-10-20 19:46:06

2018年刑侦科推理试题(C++)的相关文章

2018年刑侦科推理试题 python实现

这题越推越觉得应该用程序写,所以就用python写了一个,为什么用python,因为真的很方便. 先看看理论上是否可行,10道题,每题4个选项,也就是4的10次幂,2的20次幂,也就是20bit,2.5Byte的数据要遍历,这个数量级一般计算机妥妥够用,4Byte以内通常都可以,要是20题就是5Byte就比较吃力了,6Byte就要几周时间了,8Byte就别想了,当然是遍历完,要是在前面就出结果了例外. 下面是python源码: ask_all = 0; ask = [0,0,0,0,0,0,0,

乱七八糟:刑侦科推理试题

昨晚观察者网站登出了一个贴子这套刑侦科推理试题,什么水平?,一时转发无数.试题中的第一道,猛一看不知所以然,再往下看看发现是逻辑推理.推导了一下,还挺有意思的,想起了上数理逻辑课的日子. 原文地址:https://www.cnblogs.com/pandabang/p/8494521.html

2018行政科推理试题

最近很火的刑侦推理题,我也试了一下,答案是BCACA CDABA 如果直接推理很难,还要不断试错.既然这样不如借助计算机暴力出结果(因为只有4^9=262144种情况,可以无脑秒出).具体做法是 首先生成所有可能的答案(递归生成解答树) 筛选掉不符合10个题目要求的(剪枝,剪枝顺序还可以优化) 剩下唯一一个就是答案 附上源代码: #include <algorithm> #include <iostream> #define pass char answers[10]; // Au

2018年网易Java笔试题

OOP三特性 封装: 继承: 多态: Java中如何实现多继承 实现多个接口 使用内部类 Java对象生成过程 4.HashTable和HashMap的区别 ü  历史原因:Hashtable是基于陈旧的Dictionary类实现的,HashMap是Java 1.2引进的一个Map接口的一个实现 ü  同步性:Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的,而HashMap则是异步的,因此HashMap中的对象并不是线程安全的,因为同步的要求会影响执行

2018 Java线程热门面试题,你知道多少?

面试,难还是不难?取决于面试者的底蕴(气场+技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想上的碰撞和博弈.其实你只需要搞清楚一个逻辑:"面试官为什么会这样问?他希望听到什么答案?"然后针对性的准备和回答就行了,无他. 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发

2018年大数据面试题总结

目前面试了多家大数据开发工程师,成长了很多,也知道了很多知识,下面和大家分享一下我遇到的面试题和答案. 1.kafka集群的规模,消费速度是多少. 答:一般中小型公司是10个节点,每秒20M左右. 2.hdfs上传文件的流程. 答:这里描述的 是一个256M的文件上传过程 ① 由客户端 向 NameNode节点节点 发出请求 ②NameNode 向Client返回可以可以存数据的 DataNode 这里遵循机架感应原则 ③客户端 首先 根据返回的信息 先将 文件分块(Hadoop2.X版本 每一

2018京东校招Java笔试题

相比阿里巴巴,京东的题都是考研基础题,加上一点java基础知识和linux命令. 1. 单选题(19道题,每题2分): 1)4个并发进程都需要5个同类资源,则至少需要多少个资源,才不会导致死锁? 2)有一个user.txt文件,其中每行为一个user记录,用(sort,uniq,head,top,cat等命令组合)统计出现次数最多的3个user,及它们出现的次数. 3)序列13,18,24,35,47,50,63,83,90,115,124用二分法查找90,需要查找多少次? 4)A继承T,B继承

2018 CVTE 前端校招笔试题整理

昨天晚上(7.20)做了CVTE的前端笔试,总共三十道题,28道多选题,2道编程题 .做完了之后觉得自己基础还是不够扎实,故在此整理出答案,让自己能从中得到收获,同时给日后的同学一些参考. 首先说一下两道肥肠简单的编程题: 1.请实现这样一个函数,输入参数为一个长度为2n的整数数组,以两个整数一组的方式将数据分组,并使每组数组最小值相加为最大,输出这个最大值. 输入[1,4,3, 2],输出为4输入[1,5,7,9, 4, 12],输出为15 思路:把数组按大小排序然后相邻两项分为一组,取每组较

面试题:2018最全Redis面试题整理

1.什么是Redis?Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用.Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储.Redis支持数据的备份,即master-slave模式的数据备份. Redis 优势性能极高 – Redis