速求答案
要求:首先用自然语言或流程图或N-S图等方法描述 算法(即解题思路),然后用C++写出程序。
题目:警察局抓住了A、B、C、D四名盗窃嫌疑犯,其中只有一人是小偷。在审问时,A说:“我不是小偷”;B说:“C是小偷”;C说:“小偷肯定是D”;D说:“C在冤枉好人”。现在已经知道这四人中有三人说的是真话,一人说的是假话。请问到底谁是小偷?
[解决办法]
如果C是真话,那么D就是假话,如果C是假话,那么D就是真话,四人中三真一假
CD中必有一假,那么AB一定都是真,根据B的话,可知小偷是C。
程序不知道咋写。
[解决办法]
a, b, c, d四个变量, 取 0 代表不是小偷, 取1代表是小偷, 可以构造四重循环将可能的值都取遍试探每种可能的结果.
在a, b, c, d的某一组取值下,计算 m=(a!=1); n=(c==1); o=(d==1); p=(d!=1). 因为三人说真话,一人说假话, (m+n+o+p)==3时的那组取值就是本题的解.
考虑#1楼的意见可以给出复杂度更低的解法.
[解决办法]
#include "stdio.h"
void main()
{
int i,a,b,c,d,m[4];
for (i=0;i<4;i++)
{
m[0]=m[1]=m[2]=m[3]=0;
m[i]=1;
a=(m[0]!=1);
b=(m[2]==1);
c=(m[3]==1);
d=(m[3]!=1);
if((a+b+c+d)==3)
{
printf("%c是小偷\n",65+i);
break;
}
}
}