有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。
A说:不是我。
B说:是C。
C说:是D。
D说:他胡说。
(有一个人说的是假话)
这样子的题怎么编程呢?
------------------------------------------------------------------------
以下是我的回复:
这种问题还是要用数理逻辑方面的知识来编程。
设定以下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符合题意的真假情况。
对于这种逻辑问题,一般的编程规律就象楼上几位说的,先根据陈述句构造命题,然后根据命题之间的关系以及命题真值表的组合求得最有可能的一种真假关系。