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
展开
 我来答
itunes0004
2019-04-11 · TA获得超过4045个赞
知道大有可为答主
回答量:2685
采纳率:69%
帮助的人:511万
展开全部
#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
战倍率宜
2019-04-10 · TA获得超过209个赞
知道小有建树答主
回答量:223
采纳率:71%
帮助的人:101万
展开全部
题!!急求!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式