算法提高 断案

10 篇文章 0 订阅
9 篇文章 2 订阅
 算法提高 断案  
时间限制:1.0s   内存限制:512.0MB
    
问题描述
  公安人员审问甲、乙、丙、丁四个嫌疑犯,已确知,这四个人当中仅有一人是偷窃者,还知道这四个人的答话,要么完全诚实,要么完全说谎。在回答公安人员的问话中:
  甲说:“乙没有偷,是丁偷的。”
  乙说:“我没有偷,是丙偷的。”
  丙说:“甲没有偷,是乙偷的。”
  丁说:“我没有偷,我用的那东西是我家里的。”
  请根据上述四人答话,判断谁是偷窃者。
  输入格式:无输入。
  输出格式:输出一个字符,表示偷窃者是谁,A表示甲,B表示乙,C表示丙,D表示丁。

其实题目不难,但是需要注意的一点就是:无论一个人说的是真话还是假话,都能确定 几个人的状态 ,由于数据量不大通过暴力破解进行查找就可以找打结果。  对了再提示一个点就是:如果上下条件有冲突,说明这种情况不成立,就不用继续进行计算了直接continue吧。

# include <iostream>
# include <algorithm>
# include <sstream>
# include <stdio.h>


using namespace std;


int main (void)
{
甲乙丙丁 
bool a,b,c,d;
bool A,B,C,D;
int sum=0,sss=0;
for(int i=0;i<=1;i++)
{
for(int j=0;j<=1;j++)
{
for(int x=0;x<=1;x++)
{
for(int y=0;y<=1;y++)
{
sss++;

if(i==1)//甲说:“乙没有偷,是丁偷的。”
{
b=0  ; d=1;
}else
{
b=1  ; d=0;
}
B=b ; D=d;//由于题目说:四个人的答话要么完全诚实,要么完全说谎。 因此通过甲可以确定 b,d 是否为小偷  用BD记录下来(当然也可以不用记录,只是记录下来比较清晰) 
if(j==1)//乙说:“我没有偷,是丙偷的。”

b=0;c=1;
if(b!=B )//由于b 是否为小偷已经被确定,因此如果改变的b和确定的b有冲突 表示这种情况不成立,重新循环 
{
sum++; 
continue;
}
}
else
{
b=1;c=0;

if(b!=B )//由于b 是否为小偷已经被确定,进行比较,冲突就结束本次循环 
{
sum++; 
continue;
}
}
C=c;//同理记录下c的情况 ,方便下面判断
if(x==1)//丙说:“甲没有偷,是乙偷的。”
{
a=0;b=1;
if(b!=B )//由于b 是否为小偷已经被确定,进行比较,冲突就结束本次循环 
{
sum++; 
continue;
}
}else
{
a=1;b=0;
if(b!=B )//由于b 是否为小偷已经被确定,进行比较,冲突就结束本次循环 
{
sum++; 
continue;
}
}
if(y==1)//丁说:“我没有偷,我用的那东西是我家里的。”
{
d=0 ;
if(D!=d)//由于D 是否为小偷已经被确定,进行比较,冲突就结束本次循环 
{
sum++; 
continue;
}
}else
{
d=1; 
if(D!=d)//由于D 是否为小偷已经被确定,进行比较,冲突就结束本次循环 
{
sum++; 
continue;
}
}
if(a+b+c+d==1)
{
if(a)
{
printf("A\n");
}
if(b)
{
printf("B\n");
}
if(c)
{
printf("C\n");
}
if(d)
{
printf("D\n");
}
}
a=0;b=0;c=0;d=0; //计算过后最好进行结果清零,当然不清对结果也没有影响
}
}
}
}
return 0;
}










  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值