趣味c 编程之查找凶手


今天,遇到一个有趣的c编程题,本以为编程只能用来解决计算机上的一些问题,没想到在生活中也能运用的如此恰到好处。首先来看看这道题题目。

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。

A说:不是我。

B说:是C

C说:是D

D说:C在胡说

已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手

起初看这道题的时候,稍微觉得有点绕,但是细细一想,也能够想出凶手。根据层层的逻辑,我们可以看出里面作为凶手的那个人,就是说了谎的人,对于初涉C的我来说,该怎样将这个题目用C语言表达出来呢。

来,现在我们来一起仔细看看题目先。这道题的重点在于,4个人,三个人说了真话,凶手一个人说了假话,那么我们可以通过对每一个人与四个人的证词相比较,如果有一个人得到了三个证词的肯定,那凶手就是他了。

既然这样,我们便开始来写程序

首先C语言的老套路

#include <stdio.h>     // C语言的老套路

 

 

int main()

{

char killer;          // 定义一个凶手,因为证人是A,B,C,D,

// 所以选用字符型char

int i;

for (i = 0; i < 4; i++)    // 因为要对每个嫌疑人进行证词比对,所以来个循环

{

killer = 'A' + i;  // 作为字符A,加上i的值就可以成为B,C,D

// 这就是我们最关键的地方了,我们将每一个嫌疑人的话与他本身相匹配,假设A说的是假话,那其他人说的都是真话,然后验证其他嫌疑人的证词是否都为真,如果不是,那A不是凶手。依次,对每一个人进行轮番的验证,就能找出凶手。

int ret = (killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D');    

if (ret == 3)  // 找到凶手

{

printf ("凶手是 %c\n", killer);   // 打印出凶手的名字

break;

}

}

return 0;

}

 

是不是感觉很有趣,凶手就这样轻易被找了出来。由此,让我也知道,c语言的运用,是用来解决实际问题,并不是简简单单的来解决一些计算机上的计算而已。这让我更加觉得C语言是一门很实用的语言

在C语言中,穷举法是一种解决特定问题的算法策略,特别适用于有限状态空间的情况,比如推理问题,如在一个谜题或逻辑游戏中查找凶手(通常是一个隐藏的角色)。对于判断凶手的问题,我们可能会假设有一个预设的人物列表,并试图通过循环遍历这个列表来检查每个角色是否满足某些条件,比如动机、不在犯罪现场的证据等。 以下是简单的一个示例,假设我们有三个嫌疑人A、B、C,以及一些关于他们行动的信息: ```c #include <stdio.h> // 假设嫌疑人结构体 typedef struct { char name[50]; int motive; // 动机值 bool alibi; // 是否有不在场证明 } Suspect; void find Killer(Suspect suspects[], int numSuspects) { for (int i = 0; i < numSuspects; i++) { Suspect current = suspects[i]; // 检查嫌疑人的动机和不在场证明 if (current.motive > 0 && !current.alibi) { // 如果动机大于0且没有不在场证明 printf("凶手可能是:%s\n", current.name); return; // 凶手就提前结束 } } printf("不到凶手。\n"); } int main() { Suspect suspects[] = {{"A", 100, true}, {"B", -50, false}, {"C", 75, false}}; int numSuspects = sizeof(suspects) / sizeof(suspects[0]); find Killer(suspects, numSuspects); return 0; } ``` 在这个例子中,`findKiller`函数会穷举所有嫌疑人,直到到动机大于0且没有不在场证明的人,被认为是凶手。请注意,这只是一个简化模型,实际应用中可能需要更复杂的逻辑来处理更多的线索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值