主题:一个逻辑判断的题
yuyifan6510
[专家分:0] 发布于 2010-04-22 22:09:00
某地刑侦大队对涉及6个嫌疑人的案件进行分析:
(1)A,B至少有一个人作案;
(2)A,E,F至少有2人参与作案;
(3)A,D不可能是同案犯;
(4)B,C或是同案犯,或与本案无关;
(5)C,D中有且只有一人作案;
(6)如果D没有参与作案,则E也不可能参与作案。
各位老大帮帮忙啊!!!!!
还有啊
一定要把这一类题型的思路教给我啊!
我保证给你们加分,以前我是不知道可以给你们加分的!
最后更新于:2010-04-22 22:18:00
回复列表 (共11个回复)
沙发
liuf403 [专家分:120] 发布于 2010-04-22 22:17:00
请把题发出来好不?
板凳
yuyifan6510 [专家分:0] 发布于 2010-04-22 22:19:00
不好意思啊
第一次发图片
呵呵
不是很会
3 楼
雪光风剑 [专家分:27190] 发布于 2010-04-23 01:12:00
类似的题目就是要把已知抽象成代码
一般来说,用01标志变量法,1表示真0表示假
那么,可以设立abcdef六个变量来表示六个嫌疑人的犯罪状况
最容易想到的就是穷举,然后检查是否满足条件。穷举就是嵌套循环了(怎么循环?认真理解一下上面两行说了什么)
接下来就是逻辑表达式的翻译。举例:A,B至少有一个人作案;a,b两人的状况,而且谈到至少,那么肯定是a和b的状态放在一起考虑。至少一人作案,1个人作案变量是1,那么两人至少一人作案的表达式的值就是至少为1,完整地翻译过来就是a+b>=1
按照这样的思路写出所有的逻辑表达式,最后判断如果满足所有条件,就打出当时的6个变量的取值情况
4 楼
liuf403 [专家分:120] 发布于 2010-04-23 10:28:00
不知道你是想迅速作出这道题的答案,还是要编码求出这个答案,如果是后者,看楼上的就可以了;我说下前者吧,迅速作出这道题的答案.用假设法,即假设某个人是凶手,将条件依次推一下,满足所有条件的,可以认为假设成立,所有的判断都为正确的,得到了答案;不满足其中任意一个条件的马上可以终止判断,断定他不是凶手,再判断下一个人.拿本题做例子.假设A为凶手,(3)条可以断定D不是凶手,进而(5)判断C是凶手,进而(6)判断E不是,(2)->F是凶手,(4)->B是凶手,6个条件都满足.可以得到此题的答案了.此判断法最优判断N次,最差判断N平方次.(N为嫌疑犯人数)
5 楼
yuyifan6510 [专家分:0] 发布于 2010-04-23 18:02:00
帮忙把源代码写出来好吗?
我对看代码有感觉些
谢了!!!
6 楼
yuyifan6510 [专家分:0] 发布于 2010-04-23 18:45:00
#include <stido.h>
main()
{
int a,b,c,d,e,f;
for (a=0;a<=1;a++)
for (b=0;b<=1;b++)
for (e=0;b<=1;e++)
for (f=0;f<=1;f++)
{
if(a=0) d=1;
else d=0;
if(d=0) e=0;
c=b;
if((1<=a+b)&&(2<=a+e+f))
{
if(a==1) printf("A\n");
if(b==1) printf("B\n");
if(c==1) printf("C\n");
if(d==1) printf("D\n");
if(e==1) printf("E\n");
if(f==1) printf("F\n");
}
}
}
小弟试着写了一下但是编译器说有错误,帮忙看下哪里错了啊!
7 楼
yansheng [专家分:1530] 发布于 2010-04-24 09:27:00
离散数学问题!
8 楼
雪光风剑 [专家分:27190] 发布于 2010-04-24 10:47:00
完整源代码要求付费。lz你现在对我说的还是没有理解。好好在纸上列出真值表逐一分析六条条件吧
9 楼
雪光风剑 [专家分:27190] 发布于 2010-04-24 10:50:00
简单说下问题:条件3:两人可以都没作案
条件5:lz没有写出条件5的判断语句
代码的问题:if里判断相等应该是==,写=的话变成赋值了
10 楼
jixiangyong [专家分:30] 发布于 2010-04-27 21:46:00
3楼 正解
#include<iostream>
using namespace std;
int main()
{
int a,b,c,d,e,f;
for(a=0;a<=1;a++)
{
for(b=0;b<=1;b++)
{
for(c=0;c<=1;c++)
{
for(d=0;d<=1;d++)
{
for(e=0;e<=1;e++)
{
for(f=0;f<=1;f++)
{
if( (a||b==1)
&& (a&&e&&f==1)
&&(a&&d==0)
&&(b&&c==0)
&&(c^d==1)
&&(d&&e==0))
{
cout<<"a" <<a<<endl;
cout<<"b "<<b<<endl;
cout<<"c "<<b<<endl;
cout<<"d "<<b<<endl;
cout<<"e "<<b<<endl;
cout<<"f "<<b<<endl;
cout<<"------------------"<<endl;
}
}
}
}
}
}
}
}
我来回复