简单的逻辑推理题,怎么编程?

kenan2002 2007-03-22 04:28:05
有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。
 A说:不是我。
 B说:是C。
 C说:是D。
 D说:他胡说。


这样子的题怎么编程呢?
...全文
651 15 打赏 收藏 转发到动态 举报
写回复
用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种情况,只要当假设为某人时得不出任何不合常理的条件,那那种情况就是答案。

但我觉得这道题本身出得不太好。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧