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

时间:2021-07-24 14:40:44
有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。
 A说:不是我。
 B说:是C。
 C说:是D。
 D说:他胡说。


这样子的题怎么编程呢?

15 个解决方案

#1


做个循环,穷举4种情况,只要当假设为某人时得不出任何不合常理的条件,那那种情况就是答案。

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

#2


至少应该知道有几个人再说假话吧

#3


思路我有,但是编码怎么做?

#4


对了,忘记了,有一个人说假话

#5


有一个人说的是假话,别人都说真话,忘记写了,不好意思。
谢谢大家了!!

#6


是C吧

#7


四位2进制bit,每位分别表示A,B,C,D说的是真话还是假话, 0-假, 1-真.
一共16种可能,
从0000-1111
对应这16种状态每一种, 查看是否与题意的4个条件相符...

即可得到结果.

#8


“有一个人说的是假话,别人都说真话”——这还差不多,呵呵。

#9


#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;
}
}

#10


i told, i did.

#11


这种问题还是要用数理逻辑方面的知识来编程。
设定以下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符合题意的真假情况。

对于这种逻辑问题,一般的编程规律就象楼上几位说的,先根据陈述句构造命题,然后根据命题之间的关系以及命题真值表的组合求得最有可能的一种真假关系。

#12


学习!

#13


用命题演算!!

《离散数学》里有!
它讲得很系统!

#14


怎么把分数给你们啊,谢谢啊

#15


学习一下,总算知道怎么编这类题了,谢谢!

#1


做个循环,穷举4种情况,只要当假设为某人时得不出任何不合常理的条件,那那种情况就是答案。

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

#2


至少应该知道有几个人再说假话吧

#3


思路我有,但是编码怎么做?

#4


对了,忘记了,有一个人说假话

#5


有一个人说的是假话,别人都说真话,忘记写了,不好意思。
谢谢大家了!!

#6


是C吧

#7


四位2进制bit,每位分别表示A,B,C,D说的是真话还是假话, 0-假, 1-真.
一共16种可能,
从0000-1111
对应这16种状态每一种, 查看是否与题意的4个条件相符...

即可得到结果.

#8


“有一个人说的是假话,别人都说真话”——这还差不多,呵呵。

#9


#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;
}
}

#10


i told, i did.

#11


这种问题还是要用数理逻辑方面的知识来编程。
设定以下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符合题意的真假情况。

对于这种逻辑问题,一般的编程规律就象楼上几位说的,先根据陈述句构造命题,然后根据命题之间的关系以及命题真值表的组合求得最有可能的一种真假关系。

#12


学习!

#13


用命题演算!!

《离散数学》里有!
它讲得很系统!

#14


怎么把分数给你们啊,谢谢啊

#15


学习一下,总算知道怎么编这类题了,谢谢!