2018网上热传的刑侦推理试题答案

题目:

 以上即为题目,那么如何使用c++编程让计算机来解决以上问题呢,代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
char ans[11] = {0, 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'};
bool check_ans() {
    // 第一题不用考虑
    // 第二题
    if (ans[2] == 'A' && ans[5] != 'C') {
        return false;
    } else if (ans[2] == 'B' && ans[5] != 'D') {
        return false;
    } else if (ans[2] == 'C' && ans[5] != 'A') {
        return false;
    } else if (ans[2] == 'D' && ans[5] != 'B') {
        return false;
    }
    // 第三题
    if (ans[3] == 'A' && !(ans[3] != ans[6] && ans[2] == ans[6])) {
        return false;
    } else if (ans[3] == 'B' && !(ans[3] == ans[2] && ans[3] != ans[6])) {
        return false;
    } else if (ans[3] == 'C' && !(ans[3] == ans[6] && ans[2] != ans[6])) {
        return false;
    } else if (ans[3] == 'D' && !(ans[3] == ans[6] && ans[4] != ans[6])) {
        return false;
    }
    // 第四题
    if (ans[4] == 'A' && ans[1] != ans[5]) {
        return false;
    } else if (ans[4] == 'B' && ans[2] != ans[7]) {
        return false;
    } else if (ans[4] == 'C' && ans[1] != ans[9]) {
        return false;
    } else if (ans[4] == 'D' && ans[6] != ans[10]) {
        return false;
    }
    // 第五题
    if (ans[5] == 'A' && ans[5] != ans[8]) {
        return false;
    } else if (ans[5] == 'B' && ans[5] != ans[4]) {
        return false;
    } else if (ans[5] == 'C' && ans[5] != ans[9]) {
        return false;
    } else if (ans[5] == 'D' && ans[5] != ans[7]) {
        return false;
    }
    // 第六题
    if (ans[6] == 'A' && !(ans[2] == ans[8] && ans[4] == ans[8])) {
        return false;
    } else if (ans[6] == 'B' && !(ans[1] == ans[8] && ans[6] == ans[8])) {
        return false;
    } else if (ans[6] == 'C' && !(ans[3] == ans[8] && ans[10] == ans[8])) {
        return false;
    } else if (ans[6] == 'D' && !(ans[5] == ans[8] && ans[9] == ans[8])) {
        return false;
    }
    // 第七题
    int times[4] = {0,0,0,0};
    for (int i = 1; i <= 10; ++i) {
        ++times[ans[i] - 'A'];
    }
    int min = 11;
    char least = 'A';
    for (int i = 0; i < 4; ++i) {
        if (times[i] < min) {
            min = times[i];
            least = 'A' + i;
        }
    }
    if (ans[7] == 'A' && least != 'C') {
        return false;
    } else if (ans[7] == 'B' && least != 'B') {
        return false;
    } else if (ans[7] == 'C' && least != 'A') {
        return false;
    } else if (ans[7] == 'D' && least != 'D') {
        return false;
    }
    // 第八题
    // 不相邻这个666
    if (ans[8] == 'A' && std::abs(ans[1] - ans[7]) == 1) {
        return false;
    } else if (ans[8] == 'B' && std::abs(ans[1] - ans[5]) == 1) {
        return false;
    } else if (ans[8] == 'C' && std::abs(ans[1] - ans[2]) == 1) {
        return false;
    } else if (ans[8] == 'D' && std::abs(ans[1] - ans[10]) == 1) {
        return false;
    }
    // 第九题
    if (ans[9] == 'A' && ((ans[1] == ans[6]) == (ans[6] == ans[5]))) {
        return false;
    } else if (ans[9] == 'B' && ((ans[1] == ans[6]) == (ans[10] == ans[5]))) {
        return false;
    } else if (ans[9] == 'C' && ((ans[1] == ans[6]) == (ans[2] == ans[5]))) {
        return false;
    } else if (ans[9] == 'D' && ((ans[1] == ans[6]) == (ans[9] == ans[5]))) {
        return false;
    }
    // 第十题
    times[0] = times[1] = times[2] = times[3] = 0;
    int max = -1;
    min = 11;
    for (int i = 1; i <= 10; ++i) {
        ++times[ans[i] - 'A'];
    }
    for (int i = 0; i < 4; ++i) {
        min = std::min(min, times[i]);
        max = std::max(max, times[i]);
    }
    if (ans[10] == 'A' && max - min != 3) {
        return false;
    } else if (ans[10] == 'B' && max - min != 2) {
        return false;
    } else if (ans[10] == 'C' && max - min != 4) {
        return false;
    } else if (ans[10] == 'D' && max - min != 1) {
        return false;
    }
    return true;
}
bool dfs(int index) {
    if (index == 11) {
        return check_ans();
    }
    for (int i = 0; i < 4; ++i) {
        ans[index] = 'A' + i;
        if (dfs(index + 1)) {
            return true;
        }
    }
    return false;
}
int main() {
    dfs(1);
    std::cout << check_ans() << "\n";
    for (int i = 1; i <= 10; ++i) {
        std::cout << i << ": " << ans[i] << "\n";
    }
    return 0;
}

codes address:https://blog.dotcpp.com/duaiduai/6650

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kylinmin

江湖纷争,刀光剑影,求点过路费

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值