蓝桥杯备战-逻辑判断

来源:互联网 发布:时时彩后二智能软件 编辑:程序博客网 时间:2024/04/30 19:40

题目:

A、B、C、D、E、F、G、H、I、J 共10名学生有可能参加本次计算机竞赛,也可能不参加。因为某种原因,他们是否参赛受到下列条件的约束:
   1. 如果A参加,B也参加;
   2. 如果C不参加,D也不参加;
   3. A和C中只能有一个人参加;
   4. B和D中有且仅有一个人参加;
   5. D、E、F、G、H 中至少有2人参加;
   6. C和G或者都参加,或者都不参加;
   7. C、E、G、I中至多只能2人参加   
   8. 如果E参加,那么F和G也都参加。
   9. 如果F参加,G、H就不能参加
   10. 如果I、J都不参加,H必须参加
请编程根据这些条件判断这10名同学中参赛者名单。如果有多种可能,则输出所有的可能情况。每种情况占一行。参赛同学按字母升序排列,用空格分隔。
比如:
C D G J
就是一种可能的情况。
多种情况的前后顺序不重要
技巧: 参加为1,不参加为0,不用boolean类型

思路:这10个人有两种选择,参加或不参加,所以可以利用for循环将10个人不同选择罗列出来,再在for循环里嵌套上约束条件用if即可;

这是看了http://blog.csdn.net/xujinsmile/article/details/7413408代码启发的思路:

现在就现货现用:这题时自己借鉴以上那题写的

题目:某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析:
(1)A、B至少有一人作案;
(2)A、E、F三人中至少有两人参与作案
(3)A、D不可能是同案犯
(4)B、C或同时作案,或与本案无关
(5)C、D中有且仅有一人作案
(6)如果D没有参与作案,则E也不可能参与作案
试编一程序,将作案人员找出来

自己第一种方法是:

思路:
设六个人为a,b,c,d,e,f,则用01标记,若犯罪则为1,无罪则为0;
由题目的(1)到(5)知:a+b>=1;
                    a+e+f>=2;
                    a+d!=2;
                    c+b!=1;
                    c+d=1;
 再由(6)知:d=0时,e=0;
                  d=1时,e=0或e=1;
代码如下:


#include<iostream>
using namespace std;
int main()
{
int a,b,c,d,e,f;
for(a=0;a<2;a++)
for(b=0;b<2;b++)
for(c=0;c<2;c++)
for(d=0;d<2;d++)
for(e=0;e<2;e++)
for(f=0;f<2;f++)
{
if(d+e==0)
{
if((a+b>=1)&&(a+e+f>=2)&&(a+d!=2)&&(c+b!=1)&&(c+d==1)&&(d+e==0))
cout<<a<<b<<c<<d<<e<<f<<" ";
       
}
else if(d+e==1)
{
if((a+b>=1)&&(a+e+f>=2)&&(a+d!=2)&&(c+b!=1)&&(c+d==1)&&(d+e==1))
cout<<a<<b<<c<<d<<e<<f<<" ";
       
}
else if(d+e==2)
{
if((a+b>=1)&&(a+e+f>=2)&&(a+d!=2)&&(c+b!=1)&&(c+d==1)&&(d+e==2))
cout<<a<<b<<c<<d<<e<<f<<" ";
      
}


}
return 0;
}缺点是,若如果..............那么...............条件多时候,就不好分情况写代码了

所以引用了上面那题写就简化了许多:

另一种方法:
#include<iostream>
using namespace std;
bool juge(int *x){//用逻辑函数 
bool a1=x[0]+x[1]>=1;//A、B至少有一人作案
bool a2=x[0]+x[4]+x[5]>=2;//A、E、F三人中至少有两人参与作案
bool a3=(x[0]+x[3]==1)||(x[0]+x[3]==0);//A、D不可能是同案犯
bool a4=(x[1]+x[2]==2)||(x[1]+x[2]==0);//B、C或同时作案,或与本案无关
bool a5=x[2]+x[3]==1;//C、D中有且仅有一人作案
bool a6=x[3]==1||x[4]==0;//如果D没有参与作案,则E也不可能参与作案
return a1&&a2&&a3&&a4&&a5;//返回a1,a2,a3,a4,a5,a6的值 
}
int main()
{
char ch[]="ABCDEF";
int x[]={0,0,0,0,0,0};//初始化数组x[] 
for(x[0]=0;x[0]<2;x[0]++)//每一个元素有两种选择0或1 ,标记1为犯罪,0为无罪 
for(x[1]=0;x[1]<2;x[1]++)
for(x[2]=0;x[2]<2;x[2]++)
for(x[3]=0;x[3]<2;x[3]++)
for(x[4]=0;x[4]<2;x[4]++)
for(x[5]=0;x[5]<2;x[5]++)
if(juge(x))//调用bool函数 
{
for(int i=0;i<6;i++)
if(x[i]==1)//若犯罪 
    cout<<ch[i]<<" ";
    cout<<endl;
}
return 0;

}
解决逻辑判断题,要用到离散知识:将命题符号化
如将这句符号化:(6)如果D没有参与作案,则E也不可能参与作案  
                                        p:表示D没有参与作案,q:表示E不可能参与作案
                                       有关联词知:该局符号化为:p→q=~pvq(我这里用这个符号'~'表示非,V表示或),
因为p是表示无罪,即p=0,而~p(非p)就是有罪的,即~p=1,q表示无罪的;
q=0;即将(6)转换成c++语句:bool a6=x[3]==1||x[4]==0;


0 0
原创粉丝点击