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

本文通过逻辑推理揭示了一起谋杀案中嫌疑犯的供词真伪,利用计算机逻辑分析确定凶手。程序猿思路和简洁代码演示如何运用四人供词和真假判断找到真凶C。

题目:

 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
 以下为4个嫌疑犯的供词:
	A说:不是我。
	B说:是C。
	C说:是D。
	D说:C在胡说
	已知3个人说了真话,1个人说的是假话。
	现在请根据这些信息,写一个程序来确定到底谁是凶手。

思路:

程序猿逻辑:
            逐个分析, 
            如果A说了假话,BCD三人就说的是真话:
                           则凶手是A,凶手是C,凶手是D,C在胡说。       凶手只有1个,排除;
            如果B说了假话,ACD三人就说的是真话:
                           则凶手不是A,凶手是C,凶手是D,C在胡说。     凶手只有1个,排除;
            如果C说了假话,ABD三人就说的是真话:
                           则凶手不是A,凶手是C,凶手不是D,C在胡说。条件可能成立。凶手可能是C
            如果D说了假话,ABC三人就说的是真话:
                           则凶手不是A,凶手是C,凶手是D,凶手是D。     凶手只有1个,排除;
            这样做下来,我们排除后只剩下一种可能,C说了假话,C是凶手

按照这样的逻辑,我们虽然可以分析出C是凶手,但代码却并不友好。我们可以换个思路:

计算机逻辑:
       用三个人说真话,一个人说假话作为条件(0为假,1为真);
       一共只有四种情况,A/B/C/D为凶手
       用凶手分别遍历ABCD,四者供词加在一起,只要等于3,就可以得到凶手了

代码

void main()
{
	char killer;
	for (killer = 'A'; killer <= 'D'; killer++)              //ABCD的ASCII码值刚好是连续的
	{
		if (((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D')) == 3)
		{
			printf("%c是凶手\n",killer);
			break;
		}
	}
}

是不是很简单呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值