c语言的逻辑推理题!!急求!!!
Unit2-9、侦探调查(10分)描述:侦探调查了罪案的四位证人,从证人的话侦探得出结论是:结论1:如果男管家说的是真话,那么厨师说的也是真话。结论2:厨师和园丁不可能说...
Unit2-9、侦探调查(10分)
描述:侦探调查了罪案的四位证人,从证人的话侦探得出结论是:
结论1:如果男管家说的是真话,那么厨师说的也是真话。
结论2:厨师和园丁不可能说的都是真话。
结论3:园丁和杂役不可能都说谎。
结论4:如果杂役说的是真话,那么厨师在说谎。
已知两个人说真话,两个人说假话。判定这四位证人谁在说真话,谁在说假话。真话为1,假话为0。设P:男管家说的是真话,Q:厨师说的是真话,R:园丁说的是真话,S:杂役说的是真话。
输入:无。
输出:谁说真话,谁说假话。
范例输入:无。
范例输出:P=1,Q=1,R=1,S=1(这只是样例格式,并非结果)
提示:枚举法
命题符号化如下,
结论1:PàQ 等价于 ØP∨Q
结论2:Ø(Q∧R) 或 ØQ∨ØR
结论3:Ø(ØR∧ØS) 或R∨S
结论4:SàØQ 等价于 ØS∨ØQ 展开
描述:侦探调查了罪案的四位证人,从证人的话侦探得出结论是:
结论1:如果男管家说的是真话,那么厨师说的也是真话。
结论2:厨师和园丁不可能说的都是真话。
结论3:园丁和杂役不可能都说谎。
结论4:如果杂役说的是真话,那么厨师在说谎。
已知两个人说真话,两个人说假话。判定这四位证人谁在说真话,谁在说假话。真话为1,假话为0。设P:男管家说的是真话,Q:厨师说的是真话,R:园丁说的是真话,S:杂役说的是真话。
输入:无。
输出:谁说真话,谁说假话。
范例输入:无。
范例输出:P=1,Q=1,R=1,S=1(这只是样例格式,并非结果)
提示:枚举法
命题符号化如下,
结论1:PàQ 等价于 ØP∨Q
结论2:Ø(Q∧R) 或 ØQ∨ØR
结论3:Ø(ØR∧ØS) 或R∨S
结论4:SàØQ 等价于 ØS∨ØQ 展开
展开全部
#include <stdio.h>
typedef struct {
int P, Q, R, S;
} Result;
int checkPQ(Result const * const r) {
if(r->P) // if P is true, Q must be true.
return r->Q;
return 1;
}
int checkQR(Result const * const r) { // Q&&R = false;
return !(r->Q && r->R);
}
int checkRS(Result const * const r) { // R||S = true;
return r->R || r->S;
}
int checkSQ(Result const * const r) { // if S is true, Q is false
if(r->S)
return !r->Q;
return 1;
}
int checkPQRS(Result const * const r) {
return 2 == r->P + r->Q + r->R + r->S; // only 2 is true.
}
int main()
{
Result r;
for(int i = 0; i < 16; ++i) {
int j = i;
r.P = j % 2; j /= 2;
r.Q = j % 2; j /= 2;
r.R = j % 2; j /= 2;
r.S = j % 2;
if(checkPQRS(&r) && checkPQ(&r) && checkQR(&r) && checkRS(&r) && checkSQ(&r))
printf("P = %d, Q = %d, R = %d, S = %d\n", r.P, r.Q, r.R, r.S);
}
}
符号化短路略做简化版本:
#include <stdio.h>
typedef struct {
int P, Q, R, S;
} Result;
int checkPQ(Result const * const r) {
return r->P&&r->Q||!r->P; // if p is true, q must be true.
}
int checkQR(Result const * const r) { // Qconst *const *R = false;
return !(r->Q && r->R);
}
int checkRS(Result const * const r) { // R||S = true;
return r->R || r->S;
}
int checkSQ(Result const * const r) { // if S is true, Q is false
return r->S&&!r->Q||!r->S;
}
int checkPQRS(Result const * const r) {
return r->P + r->Q + r->R + r->S == 2; // only 2 is true.
}
int main()
{
Result r;
for(int i = 0; i < 16; ++i) {
int j = i;
r.P = j % 2; j /= 2;
r.Q = j % 2; j /= 2;
r.R = j % 2; j /= 2;
r.S = j % 2;
if(checkPQRS(&r) && checkPQ(&r) && checkQR(&r) && checkRS(&r) && checkSQ(&r))
printf("P = %d, Q = %d, R= %d, S = %d\n", r.P, r.Q, r.R, r.S);
}
}
输出结果
P = 0, Q = 0, R = 1, S = 1
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询