题目描述

有 A, B, C, D, E 5个同学涉嫌逃课:

  • (1)如果A逃课,B也一定逃课

  • (2)B和C中有且只有一个人参与逃课

  • (3)C和D要么都逃,要么都不逃

  • (4)D和E至少有一个人逃了

  • (5)如果E逃课,则A和D一定参与逃课

请输出逃课的同学:

  • 输入

  • 输出

    • 假如5个同学都逃课了,输出ABCDE
上传的附件
你的回答被采纳后将获得: 10点积分 (将会扣除手续费1点积分。)

keyboard_arrow_left上一篇 : "WRITE-BUG技术共享平台"哪个版块你最讨厌 对"WRITE-BUG技术共享平台"说一句祝福语 : 下一篇keyboard_arrow_right

3个回答

Ridiculous
2020-07-12 12:15:34

哈哈,一开始还以为是吐槽帖,没想是问问题啊。。。顺便解答下你的问题吧。

bA, bB, bC, bD, bE 来表示A、B、C、D、E,true表示逃课,false表示不逃课,原理比较简单,就是暴力枚举 bA, bB, bC, bD, bE,然后判断是否满足给出的 5 个条件,代码如下所示:

  1. bool judge(bool bA, bool bB, bool bC, bool bD, bool bE)
  2. {
  3. bool bRet = false;
  4. do
  5. {
  6. // (1)如果A逃课,B也一定逃课
  7. if (true == bA)
  8. {
  9. if (true == bB)
  10. {
  11. // 条件(1)成立
  12. }
  13. else
  14. {
  15. // 条件(1)不成立
  16. break;
  17. }
  18. }
  19. // (2)B和C中有且只有一个人参与逃课
  20. if (true == (bB || bC) && false == (bB && bC))
  21. {
  22. // 条件(2)成立
  23. }
  24. else
  25. {
  26. // 条件(2)不成立
  27. break;
  28. }
  29. // (3)C和D要么都逃,要么都不逃
  30. if (true == bC)
  31. {
  32. if (true == bD)
  33. {
  34. // 条件(3)成立
  35. }
  36. else
  37. {
  38. // 条件(3)不成立
  39. break;
  40. }
  41. }
  42. else
  43. {
  44. if (false == bD)
  45. {
  46. // 条件(3)成立
  47. }
  48. else
  49. {
  50. // 条件(3)不成立
  51. break;
  52. }
  53. }
  54. // (4)D和E至少有一个人逃了
  55. if (true == (bD || bE))
  56. {
  57. // 条件(4)成立
  58. }
  59. else
  60. {
  61. // 条件(4)不成立
  62. break;
  63. }
  64. // (5)如果E逃课,则A和D一定参与逃课
  65. if (true == bE)
  66. {
  67. if ((true == bA) && (true == bD))
  68. {
  69. // 条件(5)成立
  70. }
  71. else
  72. {
  73. // 条件(5)不成立
  74. break;
  75. }
  76. }
  77. // 所有条件都满足
  78. bRet = true;
  79. } while (false);
  80. return bRet;
  81. }
  82. int _tmain(int argc, _TCHAR* argv[])
  83. {
  84. int a = 0, b = 0, c = 0, d = 0, e = 0;
  85. bool bA = false, bB = false, bC = false, bD = false, bE = false;
  86. for (a = 0; a < 2; a++)
  87. {
  88. for (b = 0; b < 2; b++)
  89. {
  90. for (c = 0; c < 2; c++)
  91. {
  92. for (d = 0; d < 2; d++)
  93. {
  94. for (e = 0; e < 2; e++)
  95. {
  96. bA = (bool)a;
  97. bB = (bool)b;
  98. bC = (bool)c;
  99. bD = (bool)d;
  100. bE = (bool)e;
  101. // 判断
  102. if (true == judge(bA, bB, bC, bD, bE))
  103. {
  104. if (true == bA)
  105. {
  106. printf("A");
  107. }
  108. if (true == bB)
  109. {
  110. printf("B");
  111. }
  112. if (true == bC)
  113. {
  114. printf("C");
  115. }
  116. if (true == bD)
  117. {
  118. printf("D");
  119. }
  120. if (true == bE)
  121. {
  122. printf("E");
  123. }
  124. printf("\n");
  125. }
  126. }
  127. }
  128. }
  129. }
  130. }
  131. return 0;
  132. }

运行程序,结果显示:CD,则表示C和D逃课满足上述5个条件~~~

Tattoo
2020-07-14 11:22:42

像这道题,直接printf输出结果,会不会就过了呢??

guandq
2020-07-27 17:09:57

先进行条件合并
1、三四两条,合并为C和E至少有一个人逃了
(1)如果A逃课,B也一定逃课
(2)B和C中有且只有一个人参与逃课
(3)C和E至少有一个人逃了
(5)如果E逃课,则A和D一定参与逃课
2、通过二三两条分析,假设B逃课,则C没逃课,E逃课,但通过第五条对比分析,D也逃课,因C和D是要么都逃课,要么都没逃课,顾B逃课不成立,由此可知C一定逃课
故:A、B未逃课,C、D都逃课,E未逃课

精彩评论

eject