【算法应该怎么“玩” - 王晓华】第一 - 罪犯真假供词的判断

通过数学逻辑和编程技巧,解决一个经典的推理问题——找出四名嫌疑人中唯一的小偷。利用C++编程实现算法,通过对每个人陈述的真假判断,确定说谎者并找出罪犯。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序及解释来自

https://gitbook.cn/gitchat/column/5b6d05446b66e3442a2bfa7b/topic/5b84bdcb76146e490678c3ce

仅为交流学习之用,如有侵权,请私信。

-----------------------------------------------------------------

警察抓了 A、B、C、D 四名罪犯,其中一名是小偷,审讯的时候:

A说:“我不是小偷。”    x !=0
B说:“C 是小偷。”     x = 2
C说:“小偷肯定是 D。”  x = 3 
D说:“C 是在冤枉人。”  x != 3

现在已经知道四个人中三个人说的是真话,一个人说了假话,请判断一下到底谁是小偷?

对这个问题分析,首先对 A、B、C、D 四个人分别用 0~3 四个数字进行编号,接着将四个人的描述结果用数字量化,如果描述是真,则结果是 1,如果是假,则结果是 0。我们假设小偷的编号是 x,对于四个人的描述,数字化的结果是:

    int dis_a = (x != 0) ? 1 : 0;
    int dis_b = (x == 2) ? 1 : 0;
    int dis_c = (x == 3) ? 1 : 0;
    int dis_d = 1 - dis_c;

依次假设 x 是 A、B、C、D(0~3 的编号数值),对每次假设对应的 dis_a、dis_b、dis_c 和 dis_d 的值求和,若结果是 3,则表示假设是对的,x 对应的值就是小偷的编号。如此将自然语言的信息数子化后,算法就可以非常简单地实现了:

//Copyright (c) China University of Petroleum, Beijing Campus (CUP),2018.
//All rights reserved.


#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "io.h" 
#include<iostream>
#include <iostream>
#include <string>
#include "time.h"
#define BLANK 999999
#define pi  3.1415926
using namespace std;


void who_is_thief()
{
	for (int x = 0; x < 4; x++)
	{
		int dis_a = (x != 0) ? 1 : 0;
		int dis_b = (x == 2) ? 1 : 0;
		int dis_c = (x == 3) ? 1 : 0;
		int dis_d = 1 - dis_c;

		if ((dis_a + dis_b + dis_c + dis_d) == 3)
		{
			char thief = 'A' + x;
			std::cout << "The thief is " << thief << std::endl;
			break;
		}
	}
}

int main(){
	who_is_thief();
	system("pause");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值