蓝桥杯备战-逻辑判断
来源:互联网 发布:时时彩后二智能软件 编辑:程序博客网 时间: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;
- 蓝桥杯备战-逻辑判断
- 逻辑判断
- 逻辑判断
- 【备战蓝桥杯】USACO-> Beads
- 【备战蓝桥杯】USACO--> Transformation
- 【备战蓝桥杯】USACO-->palsquare
- 【备战蓝桥杯】USACO--> milk
- 【备战蓝桥杯】USACO-->dualpul
- 【备战蓝桥杯】USACO-->crypt
- 蓝桥杯备战-序列求和
- 蓝桥杯备战-字母图形
- 蓝桥杯备战-01字串
- 蓝桥杯备战-阶乘计算
- 蓝桥杯备战-精度加法
- 蓝桥杯备战--质因数分解
- 如何备战蓝桥杯
- 备战
- 备战
- Git 2分钟指南
- 软件工程学习之流程
- OSI和TCP/IP的区别
- zoj3329(期望DP)
- Java 的String问题
- 蓝桥杯备战-逻辑判断
- Maven 目录结构的解析
- 网站发布—图解Win7旗舰版中的IIS配置asp.net运行环境(二)
- 【会议记录】小组第三次会议纪要
- Divide Two Integers
- 开源模拟器汇总
- 去掉织梦DedeCMS列表推荐时被加粗的方法
- Window对象
- UVA - 10465 Homer Simpson