写一个程序来确定到底谁是凶手

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



用0来表示不是凶手 1表示是凶手
假设所有人都是0
A=0,B=0,C=0,D=0
只有一个人说假话那就会出现四种情况
(1)A在说谎,根据每个人的供词可得出( A=1 C=1 D=1 D=0) 这里首先就出现了三个凶手的矛盾,而且D是凶手D不是凶手也矛盾,所以可得出A并没有乱讲。
(2)B在说谎,根据每个人的供词得出 (A=0 C=0 D=1 D=0)D是凶手D不是凶手发生矛盾。
(3)C在说谎,根据每个人的供词得出 (A=0 C=1 D=0 D=0)这里只有一个凶手而且还没有矛盾发生,因此可断定C就是凶手。
(4)D在说谎,根据每个人的供词得出 (A=0 C=1 D=1 D=0)这里出现了两个凶手发生矛盾。

所以呢,代码如下:

#include <stdio.h>
#include <windows.h>
int main()
{
	int A = 0;
	int B = 0;
	int C = 0;
	int D = 0;
	int against = 0 ;//因为C和D说的话刚好对立,表示对立的。 
	int i = 0;
	for (i = 1; i <= 4; i++)
	{

		if (i == 1)//A说的假话  
		{
			A = 1; 
			C = 1; 
			against = 1; 
			D = 0;
		}
		if (i == 2)//B说的假话  
		{
			A = 0; 
			C = 0; 
			against = 1; 
			D = 0;
		}
		if (i == 3)//C说的假话  
		{
			A = 0; 
			C = 1; 
			against = 0; 
			D = 0;
		}
		if (i == 4)//D的说的假话  
		{
			A = 0; 
			C = 1; 
			against = 1; 
			D = 0;
		}
		if (A + B + C + D + against == 1 && against == D)//A + B + C + D + against == 1 表示事件不会同时发生,所以会出现一个凶手。
	                                                         //因为C和D说的话推出的都是D是凶手D不是凶手 &&against == D是为了排除D是D不是的情况
			printf("A=%d B=%d C=%d D=%d\n", A, B, C, D); 
	}
	system("pause");
	return 0;
}



程序运行结果:


第二种方法:直接根据题意(对上面的方法进行优化)

#include <stdio.h>
#include <windows.h>
int main()
{
	int slayer = 0;
	for (slayer = 'a'; slayer<'e'; slayer++)
	{
		if (3 == (slayer != 'a') + (slayer == 'c') + (slayer == 'd') + (slayer != 'd'))
		  //3人说真话,1人说假话的逻辑表示
		{
			printf("凶手是%c\n", slayer);
		}
	}
	system("pause");
	return 0;
}
程序运行结果:




  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值