社区
新手乐园
帖子详情
简单的逻辑推理题,怎么编程?
kenan2002
2007-03-22 04:28:05
有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。
A说:不是我。
B说:是C。
C说:是D。
D说:他胡说。
这样子的题怎么编程呢?
...全文
704
15
打赏
收藏
简单的逻辑推理题,怎么编程?
有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。 A说:不是我。 B说:是C。 C说:是D。 D说:他胡说。 这样子的题怎么编程呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zhangq062336
2009-10-26
打赏
举报
回复
学习一下,总算知道怎么编这类题了,谢谢!
kenan2002
2007-03-25
打赏
举报
回复
怎么把分数给你们啊,谢谢啊
猪的飞想
2007-03-24
打赏
举报
回复
用命题演算!!
《离散数学》里有!
它讲得很系统!
chensanniang
2007-03-24
打赏
举报
回复
学习!
xlbdan
2007-03-23
打赏
举报
回复
是C吧
hailongchang
2007-03-23
打赏
举报
回复
这种问题还是要用数理逻辑方面的知识来编程。
设定以下4个命题:
p = 不是我;
q = 是C
r = 是D
s = 她胡说
根据他们的说法,可以得到如下关系:
q 蕴含 p
r 蕴含 p
q 异或于 r
s 与r是非的关系
另外还有一个非常重要的关系,就是p,q,r,s只能有一个为假,其余都为真。
下面是上述关系的函数表示:
bool implication(bool A,bool B) //A蕴含B
{
if((A==true)&&(B==false))
return false;
else
return true;
}
bool Xor(bool A,bool B) //A异或于B
{
return A^B;
}
bool Not(bool A,bool B) //A is not B
{
if(A==(!B))
return true;
else
return false;
}
下面是源代码:
#include<iostream>
using namespace std;
bool implication(bool A,bool B)
{
if((A==true)&&(B==false))
return false;
else
return true;
}
bool Xor(bool A,bool B)
{
return A^B;
}
bool Not(bool A,bool B)
{
if(A==(!B))
return true;
else
return false;
}
int main()
{
bool p,q,r,s;
int a[4]={0x7,0xB,0xD,0xE}; //p,q,r,s中只能有一个0,因此做此限定
for(int n=0;n<4;n++)
{
p = 0x1&a[n];
q = 0x2&a[n];
r = 0x4&a[n];
s = 0X8&a[n];
if(Not(s,r)&&Xor(q,r)&&implication(q,p)&&implication(r,p)&&implication(q,s))
cout << p << " " << q << " " << r << " " << s << endl;
}
system("pause");
return 0;
}
以上求出的是命题p,q,r,s符合题意的真假情况。
对于这种逻辑问题,一般的编程规律就象楼上几位说的,先根据陈述句构造命题,然后根据命题之间的关系以及命题真值表的组合求得最有可能的一种真假关系。
loveisbug
2007-03-23
打赏
举报
回复
i told, i did.
晨星
2007-03-23
打赏
举报
回复
#include <iostream>
using namespace std;
bool tells_the_truth(char who_told, char who_did);
int main(){
for(char who_did = 'A'; who_did <= 'D'; ++who_did) {
int count_truth = 0;
for(char who_told = 'A'; who_told <= 'D'; ++who_told) {
if(tells_the_truth(who_told, who_did))
++count_truth;
}
if(3 == count_truth) {
cout << "Maybe " << who_did << " did the good." << endl;
}
}
}
bool tells_the_truth(char who_told, char who_did) {
switch(who_told) {
case 'A':
return 'A' != who_did; // A说:不是我。
case 'B':
return 'C' == who_did; // B说:是C。
case 'C':
return 'D' == who_did; // C说:是D。
case 'D':
return 'D' != who_did; // D说:他胡说。
default:
return false;
}
}
晨星
2007-03-23
打赏
举报
回复
“有一个人说的是假话,别人都说真话”——这还差不多,呵呵。
xiaocai0001
2007-03-23
打赏
举报
回复
四位2进制bit,每位分别表示A,B,C,D说的是真话还是假话, 0-假, 1-真.
一共16种可能,
从0000-1111
对应这16种状态每一种, 查看是否与题意的4个条件相符...
即可得到结果.
kenan2002
2007-03-22
打赏
举报
回复
有一个人说的是假话,别人都说真话,忘记写了,不好意思。
谢谢大家了!!
kenan2002
2007-03-22
打赏
举报
回复
对了,忘记了,有一个人说假话
kenan2002
2007-03-22
打赏
举报
回复
思路我有,但是编码怎么做?
intuition444
2007-03-22
打赏
举报
回复
至少应该知道有几个人再说假话吧
晨星
2007-03-22
打赏
举报
回复
做个循环,穷举4种情况,只要当假设为某人时得不出任何不合常理的条件,那那种情况就是答案。
但我觉得这道题本身出得不太好。
一道
逻辑推理
题
的程序实现(纯属娱乐)
http://t1174779123.iteye.com/blog/2008357
Python:布尔值做加法巧解
逻辑推理
题
在Python的官方文档中写到:Python中的布尔值是作为整数的子类实现的。 布尔值做加法巧解
逻辑推理
题
在Python语言中布尔类型的True和False与整型的1和0完全一样。 True==1 True True==2 False False==0 True 还可以对布尔类型和整型之间进行类型转换。布尔类型转整型,True转换成1,False转换成0。整型转布尔类型,0转换成False,除了0以外的数字都转为True。 int(True) 1 i
2020校招笔试之新华三
现场笔试,共90分钟 软件开发中心 分Java和c语言部分(选做Java或者c) 以下为Java部分 一、单选
题
(8
题
) 1、栈底至栈顶依次存放元素A.B.C.D,在第五个元素E入栈前,栈中元素可以出栈,则出栈序列可能是() 2、143%15的结果是多少 解
题
思路:求余 3、三把钥匙开三个锁,最多几次可以完全匹配(B) A、2B、3C、6...
who is murderer?
/* 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个 嫌疑犯的一个。以下为4个嫌疑犯的供词。 A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说 已知3个人说了真话,1个人说的是假话。 现在请根据这些信息,写一个程序来确定到底谁是凶手。 思路: 既然是三个人说了真话一个人说了假话,那么,他们四个人的逻辑值结果加起来等于三。 这个kill可能是四个人中的任何一个人,所以将四个人依...
逻辑
题
:谁是卸载按钮——cpp代码
这年头,小学数学没学好连卸载软件的资格都没有。 下面只有一个按钮说了真话。那么谁是卸载按钮? A:是B! B:是D! C:不是我! D:B撒谎! 非常常见的逻辑
题
了,小学3年级就开始见 。现在用代码来解决它。首先有2种实现思路,一种是枚举说真话的按钮,另一种是枚举卸载按钮(合理假设:卸载按钮有且只有1个)。前者貌似比后者难,因此我们枚举卸载按钮,并验证说真话的按钮个数是否等于1。 #include <bits/stdc++.h> using namespace std; typedef lon
新手乐园
33,316
社区成员
41,770
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章