C++解2018刑侦科推理卷(闲的DT系列)

刑侦推理卷的C++解答

本文代码调试环境:
VS2017 + Windows 7
不能运行的请注意C++的版本,至少C++ 11


问题描述

这里写图片描述

问题思路

用递归的话,一不小心就会Stack Overflow。

解答程序*(全)

// ConsoleApplication1.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>

using namespace std;

// =======================  声明与初始化  =======================

const bool flag[10] = { true, false, true, false, true, true, true, false, true, true}; // 控制是否遍历

int Q1(const bool control = flag[0]);
int Q2(const bool control = flag[1]);
int Q3(const bool control = flag[2]);
int Q4(const bool control = flag[3]);
int Q5(const bool control = flag[4]);
int Q6(const bool control = flag[5]);
int Q7(const bool control = flag[6]);
int Q8(const bool control = flag[7]);
int Q9(const bool control = flag[8]);
int Q10(const bool control = flag[9]);

int(*pf[])(const bool control) = { Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10 };

void show();
void resolve();
int  code();
void decode(int num);
char translate(int in);

int a[10] = { 0 };


// =======================  题目逻辑部分  =======================


// 第1题
int Q1(const bool control)
{
    return a[0];
}


// 第2题
int Q2(const bool control)
{
    if (control)
        return a[1];
    switch (Q5())
    {
    case 1:
        return 3;
        break;
    case 2:
        return 4;
        break;
    case 3:
        return 1;
        break;
    case 4:
        return 2;
        break;
    default:
        return 0;
        break;
    }
}


// 第3题
int Q3(const bool control)
{
    if (control)
        return a[2];

    int t4 = Q4();
    int t2 = Q2();
    int t3 = Q3();
    int t6 = Q6();

    int val = (t2 == t3) + (t2 == t4) + (t2 == t6); // 唯一性检查
    if (val == 0)
    {
        return 3;
    }
    else if (val == 2)
    {
        if (t2 != t3)
            return 1;
        else if (t2 != t4)
            return 4;
        else if (t2 != t6)
            return 2;
        else
            return 0;
    }
    else
    {
        return 0;
    }
}


// 第4题
int Q4(const bool control)
{
    if (control)
        return a[3];

    int t5 = Q5();
    int t8 = Q8();
    int t9 = Q9();
    int t7 = Q7();
    int t1 = Q1();
    int t6 = Q6();
    int t2 = Q2();
    int t10 = Q10();

    int val = (t1 == t5) + (t2 == t7) + (t1 ==t9) + (t6 == t10); // 唯一性检查
    if (val == 1)
    {
        if (t1 == t5)
            return 1;
        else if (t2 == t7)
            return 2;
        else if (t1 == t9)
            return 3;
        else if (t6 == t10)
            return 4;
    }
    return 0;
}


// 第5题
int Q5(const bool control)
{
    if (control)
        return a[4];

    int t5 = Q5();
    int t8 = Q8();
    int t4 = Q4();
    int t9 = Q9();
    int t7 = Q7();

    int val = (t5 == t8) + (t5 == t4) + (t5 == t9) + (t5 == t7); // 唯一性检查
    if (val == 1)
    {
        if (t5 == t8)
            return 1;
        else if (t5 == t4)
            return 2;
        else if (t5 == t9)
            return 3;
        else if (t5 == t7)
            return 4;
    }
    return 0;
}


// 第6题
int Q6(const bool control)
{
    if (control)
        return a[5];

    int t8 = Q8();
    int t6 = Q6();
    int t1 = Q1();
    int t5 = Q5();
    int t9 = Q9();
    int t2 = Q2();
    int t10 = Q10();
    int t3 = Q3();
    int t4 = Q4();

    int f1 = (t8 == t2) * (t2 == t4);
    int f2 = (t8 == t1) * (t1 == t6);
    int f3 = (t8 == t3) * (t3 == t10);
    int f4 = (t8 == t5) * (t5 == t9);

    int val = f1 + f2 + f3 + f4; // 唯一性检查
    if (val == 1)
    {
        if (f1)
            return 1;
        else if (f2)
            return 2;
        else if (f3)
            return 3;
        else if (f4)
            return 4;
    }
    return 0;
}


// 第7题:尚未修复重复问题
int Q7(const bool control)
{
    if (control)
        return a[6];

    int a, b, c, d;
    a = 0; b = 0; c = 0; d = 0;

    for (int i = 0; i < 10; i++)
    {
        switch (pf[i](flag[i]))
        {
        case 1:
            a++;
            break;
        case 2:
            b++;
            break;
        case 3:
            c++;
            break;
        case 4:
            d++;
            break;
        default:
            break;
        }
    }

    if (a < b)
    {
        if (a < c)
        {
            if (a < d)
                return 3;
            else
                return 4;
        }
        else
        {
            if (c < d)
                return 1;
            else
                return 4;
        }
    }
    else
    {
        if (b < c)
        {
            if (b < d)
                return 2;
            else
                return 4;
        }
        else
        {
            if (c < d)
                return 1;
            else
                return 4;
        }
    }
}


// 第8题
int Q8(const bool control)
{
    if (control)
        return a[7];

    int t2 = Q2();
    int t1 = Q1();
    int t5 = Q5();
    int t7 = Q7();
    int t10 = Q10();

    if (t1*t2*t5*t7*t10 == 0)
        return 0;

    int f1 = (abs(t1 - t7) != 1);// 不相邻为1,反之为0
    int f2 = (abs(t1 - t5) != 1);
    int f3 = (abs(t1 - t2) != 1);
    int f4 = (abs(t1 - t10) != 1);
    int val = f1+f2+f3+f4; // 唯一性检查
    if (val == 1)
    {
        if (f1)
            return 1;
        else if (f2)
            return 2;
        else if (f3)
            return 3;
        else if (f4)
            return 4;
    }
    return 0;
}


// 第9题
int Q9(const bool control)
{
    if (control)
        return a[8];

    int t1 = Q1();
    int t6 = Q6();
    int t5 = Q5();

    bool val_X = (t1 == t6);
    bool val_Y;
    for (int X = 0; X < 10; X++)
    {
        val_Y = (t5 == pf[X](flag[X]));
        if (val_X != val_Y)
        {
            switch (X + 1)
            {
            case 6:
                return 1;
                break;
            case 10:
                return 2;
                break;
            case 2:
                return 3;
                break;
            case 9:
                return 4;
                break;
            default:
                break;
            }
        }
    }
    return 0;
}


// 第10题
int Q10(const bool control)
{
    if (control)
        return a[9];
    int a, b, c, d;
    a = 0; b = 0; c = 0; d = 0;

    for (int i = 0; i < 10; i++)
    {
        switch (pf[i](flag[i]))
        {
        case 1:
            a++;
            break;
        case 2:
            b++;
            break;
        case 3:
            c++;
            break;
        case 4:
            d++;
            break;
        default:
            break;
        }
    }

    int gap[6] = { abs(a - b), abs(a - c), abs(a - d), abs(b - c), abs(b - d), abs(c - d) };
    int max = gap[0]; // 最多与最少次数之差即为差值的最大值,故使用冒泡找最大
    for (int item: gap)
    {
        max = item > max ? item : max;
    }
    switch (max)
    {
    case 3:
        return 1;
        break;
    case 2:
        return 2;
        break;
    case 4:
        return 3;
        break;
    case 1:
        return 4;
        break;
    default:
        break;
    }
    return 0;
}


// ======================= 主程序部分  =======================

// 编码
int  code()
{
    int n = 1;
    for (bool item : flag)
    {
        if (item)
            n*=4;
    }
    cout << "十进制共0~" << n-1 << "位" << endl;
    return n - 1;
}


// 解码
void decode(int num)
{
    for (int i = 0; i < 10; i++)
    {
        if (flag[i])
        {
            a[i] = num % 4+1;
            num /= 4;
        }
    }
}

// 问题解决
void resolve()
{
    cout << "Config Info:" << endl;
    for (int k = 0; k < 10; k++)
        cout <<"第"<<k+1<<"题:" << ((flag[k]==1)?"true":"false") << endl;
    cout << "Are you going to continue?" << endl;
    getchar();

    const int H_limit = code();
    int result_tmp = 0;
    for (int i = 0; i <= H_limit; i++)
    {
        decode(i);
        for (int j = 1; j < 10; j++)
        {
            result_tmp = pf[j](false);
            if ((flag[j]) && (result_tmp != a[j]))
                break;
            cout << i << " 第"<<j+1<<"题:" << translate(result_tmp) << " " ;
            show();
            if (result_tmp != 0)
            {
                a[j] = result_tmp;
                if (j == 9)
                    return;
            }
            else
                break;
        }   
    }
    return;
}


// 翻译
char translate(int in)
{
    switch (in)
    {
    case 0:
        return '0';
        break;
    case 1:
        return 'A';
        break;
    case 2:
        return 'B';
        break;
    case 3:
        return 'C';
        break;
    case 4:
        return 'D';
        break;
    default:
        break;
    }
    return 'X';
}


// 答案显示
void show()
{
    for (int item : a)
    {
        cout << translate(item) << " ";
    }
    cout << endl;
}

// 主程序入口
int main()
{
    decode(code());
    resolve();
    show();
    getchar();
    return 0;
}

运行结果

这里写图片描述
答案为:BCACA CDABA

PS: 去掉显示后只需0.003s出结果,遍历不可能有这么快。(手动斜眼)
这里写图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值