标签:c语言
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说。 等同于“不是D”
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
做之前的做题思路:
如果说A说的是假话,即BCD说的都是真话。即 是A,是C,是D,不是D。他们的说法相互矛盾,所以这种推论是错误的。
如果说B说的是假话,即ACD说的都是真话。即 不是A,不是C,是D,不是D。他们的说法相互矛盾,所以这种推论是错误的。
如果说C说的是假话,即ABD说的都是真话。即 不是A,是C,不是D,不是D。此推论说明C是嫌疑人。
如果说D说的是假话,即ABC说的都是真话。即 不是A,是C,是D,不是D。他们的说法相互矛盾,所以这种推论是错误的。
借鉴之后的程序:
#include <stdio.h>
int main()
{
int i,sum=0; //sum是用来计数有几个人说了真话
char killer;
for(i=1;i<=4;i++)
{
killer=64+i; //是为了输出A,B,C,D这4个字母 65(A) 66(B) 67(C) 68(D)
sum=(killer!=‘A‘)+(killer==‘C‘)+(killer==‘D‘)+(killer!=‘D‘); //此处是A,B,C,D各自的供词
if(sum==3) //即有3个人说的是真话
{
printf("凶手是%c\n",killer);
break;
}
}
return 0;
}
别人的程序,感觉更加完整:(加上了自己的注释)
//穷举法
#include<stdio.h>
int main()
{
char killer;
int i,sum=0;
int kag=0;
for(i=1;i<=4;i++)
{
killer=64+i; //是为了输出A,B,C,D这4个字母 65(A) 66(B) 67(C) 68(D)
sum=(killer!=‘A‘)+(killer==‘C‘)+(killer==‘D‘)+(killer!=‘D‘); //这是A,B,C,D各自的供词,分别为:不是A,是C,是D,不是D
if(sum==3)
{
kag=1;
printf("killer is %c\n",killer);
break;
}
}
if(kag==0)
{
printf("cann‘t find killer!\n");
}
return 0;
}
本文出自 “感悟” 博客,转载请与作者联系!
3个人说了真话,1个人说的是假话。写一个程序来确定到底谁是凶手
标签:c语言
原文地址:http://10707684.blog.51cto.com/10697684/1697253