一类简单离散数学推理题的代码实现原理

这三道题的做法基本相同 ,所以写的较为简便。

题目1:某件事是甲,乙,丙,丁4人干的,询问4人后回答如下:1):甲说是丙干的;2)乙说我没干;3):丙说甲讲的不对;4):丁说是甲干的。若其中3人说的是对的,1人说的是错的。问是谁干的?

1:设命题a,b,c,d分别表示是甲,乙,丙,丁干的,翻译每句话后即可用编程实现,具体代码如下:

#include<iostream>
using namespace std;
int main(){
	int a,b,c,d,q,r,s,m;//a,,b,c,d分别表示是这件事是甲,乙,丙,丁干的 ,q,r,s,m分别表示四句话翻译后的表达式 
	for(int a=0;a<=1;a++){
		for(int b=0;b<=1;b++){
			for(int c=0;c<=1;c++){
				for(int d=0;d<=1;d++){
					q=(a||b||c||d)&&!b&&!c&&(a&&!b&&!c&&!d);
					r=(!a&&!b&&c&&!d)&&b&&!c&&(a&&!b&&!c&&!d);
					s=(!a&&!b&&c&&!d)&&!b&&c&&(a&&!b&&!c&&!d);
					m=(!a&&!b&&c&&!d)&&!b&&!c&&!(a&&!b&&!c&&!d);
					if(q||r||s||m){
						if(a==1) cout<<"甲干的";
						if(b==1) cout<<"乙干的";
						if(c==1) cout<<"丙干的";
						if(d==1) cout<<"丁干的";
					}
				}
			}
		}
	}
	return 0;
} 

题目2:在某次研讨会的中间休息时间,3名与会者根据王教授的口音对他是哪个省市的人判断如下:
甲:王教授不是苏州人,是上海人。
乙:王教授不是上海人,是苏州人。
丙:王教授既不是上海人,也不是杭州人。

#include<iostream>
using namespace std;
int main(){
	int p,q,r,a1,a2,a3,a4,a5,a6;//p,q,r分别表示王教授是苏州,上海,杭州人; 
    for(int p=0;p<=1;p++)
        for(int q=0;q<=1;q++)
            for(int r=0;r<=1;r++)
                a1=(!p&&q)&&((p&&q)||(!p&&!q))&&(q&&r);//a1~a6代表翻译后的六种可能情况; 
                a2=(!p&&q)&&(!p&&q)&&((!q&&r)||(q&&!r));
                a3=((!p&&!q)||(p&&q))&&(p&&!q)&&(q&&r);
                a4=((!p&&!q)||(p&&q))&&(!p&&q)&&(!q&&!r);
                a5=(p&&!q)&&((p&&q)||(!p&&!q))&&((!q&&r)||(q&&!r));
                a6=(p&&!q)&&((p&&q)||(!p&&!q))&&(!q&&!r);
                if((a1||a2|a3||a4||a5||a6)&&(p+q+r==1)){
        	        if(p==1) cout<<"王教授是 苏州人";
        	        if(q==1) cout<<"王教授是 上海人";
        	        if(r==1) cout<<"王教授是 杭州人"; 
	}
	return 0;
}

题目三:29:在某班班委成员的选举中,已知王小红、李强、丁金生三位同学被选进了班委会,该班的甲,乙,两三名学生预言如下。
甲说:王小红为班长,李强为生活委员。
乙说:丁金生为班长,王小红为生活委员。
丙说:李强为班长,王小红为学习委员。
班委会分工名单公布后发现,甲、乙、丙三人都恰好猜对了一半。问:王小红,李强,丁金生各任何职?
解法见如下代码:

#include<iostream>
using namespace std;
int main(){
	int a,b,c,d,e,f;//a:王是班长,b:丁是班长,c:李强是班长,d:李强是生活委员,e:王是生活委员,f:王是学习委员;
	for(int a=0;a<=1;a++){
		for(int b=0;b<=1;b++){
			for(int c=0;c<=1;c++){
				for(int d=0;d<=1;d++){
					for(int e=0;e<=1;e++){
						for(int f=0;f<=1;f++){
							if(((a&&!d)||(!a&&d))&&((b&&!e)||(!b&&e))&&((c&&!f)||(!c&&f))&&(a+b+c==1)&&(d+e==1)&&(a+e+f==1)){
								if(a==1) cout<<"王是班长"<<endl;
								if(b==1) cout<<"丁是班长"<<endl;
								if(c==1) cout<<"李强是班长"<<endl;
								if(d==1) cout<<"李强是生活委员"<<endl;
								if(e==1) cout<<"王是生活委员"<<endl;
								if(f==1) cout<<"王是学习委员"<<endl; 
							}
						}
					}
				}
			}
		}
	} 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值