题目描述

有 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上一篇 : python的web框架 数据结构应该怎么学 : 下一篇keyboard_arrow_right

6个回答

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未逃课

edwin
2021-01-20 09:35:09

给你个借鉴吧 我这边是php语言的

基本语法如下:
直接一个类实现

  1. /**
  2. * 1)如果A逃课,B也一定逃课
  3. * 2)B和C中有且只有一个人参与逃课
  4. * 3)C和D要么都逃,要么都不逃
  5. * 4)D和E至少有一个人逃了
  6. * 5)如果E逃课,则A和D一定参与逃课
  7. */
  8. class Truancy{
  9. private $first = 'A';
  10. public $set_list = [];
  11. public function __construct($first = ''){
  12. if($first)
  13. $this->first = $first;
  14. array_push($this->set_list , $this->first);
  15. $this->relationship();
  16. }
  17. // 主要逻辑
  18. private function relationship(){
  19. if(in_array('A',$this->set_list)){
  20. array_push($this->set_list , 'B');
  21. }
  22. if(in_array('B',$this->set_list)){
  23. if(in_array('A',$this->set_list) == false){
  24. array_push($this->set_list , 'A');
  25. }
  26. if(in_array('C',$this->set_list)){
  27. $key = array_search('C');
  28. unset($this->set_list[$key]);
  29. }
  30. }
  31. if(in_array('C',$this->set_list)){
  32. if(in_array('B',$this->set_list)){
  33. $key = array_search('B');
  34. unset($this->set_list[$key]);
  35. }
  36. if(in_array('D',$this->set_list) == false){
  37. array_push($this->set_list , 'D');
  38. }
  39. }
  40. if(in_array('D',$this->set_list) == false){
  41. if(in_array('E',$this->set_list) == false){
  42. $key = rand(1,2);
  43. $array_de = ['D','E']; // 两个随机出一个 如果两个都没有逃课的情况任意选择一个
  44. array_push($this->set_list , $array_de[$key-1]);
  45. }
  46. }
  47. if(in_array('E',$this->set_list)){
  48. if(in_array('D',$this->set_list) == false){
  49. array_push($this->set_list , 'D');
  50. }
  51. if(in_array('A',$this->set_list) == false){
  52. array_push($this->set_list , 'A');
  53. array_push($this->set_list , 'B');
  54. if(in_array('C',$this->set_list)){
  55. $key = array_search('C');
  56. unset($this->set_list[$key]);
  57. $key = array_search('D');
  58. unset($this->set_list[$key]);
  59. }
  60. }
  61. }
  62. // 将结果变成字符串显示(数组集合变成字符串)
  63. function merge_arr($v1,$v2)
  64. {
  65. return $v1 . "" . $v2;
  66. }
  67. sort($this->set_list);
  68. $this->set_list = array_reduce($this->set_list,merge_arr);
  69. }
  70. }
  71. $Truancy = new Truancy("B");
  72. // 输出结果
  73. var_dump($Truancy->set_list) ;
2021-03-03 11:51:38

我也看了这个问题,可能是因为输出格式问题没有ac吧……
我用了C语言的位运算,用单个数字表示五个人的逃课状况,比如00000就是都没逃课,01100就是只有BC逃课。用到了位进制运算符>>和<<,在递归函数中用了swich,最大数字是32,用char也可以,占用空间会小一些。

我的代码长这样:

2021-03-03 11:53:43

我也看了这个问题,可能是因为输出格式问题没有ac吧……
我用了C语言的位运算,用单个数字表示五个人的逃课状况,比如00000就是都没逃课,01100就是只有BC逃课。用到了位进制运算符>>和<<,在递归函数中用了swich,最大数字是32,用char也可以,占用空间会小一些。

我的代码长这样:

include<stdio.h>

include<stdlib.h>

/A->B; BvC; (C^D)v(-C^-D); DvE; E->(A^D)/

int check(int ans) {
if ((ans >> 4) && (ans >> 3) % 2 == 0)
return 0;
if ((((ans >> 3) % 2) && ((ans >> 2) % 2)) || (!((ans >> 3) % 2) && !((ans >> 2) % 2)))
return 0;
if (((ans >> 2) % 2) - ((ans >> 1) % 2))
return 0;
if (!((ans >> 1) % 2) && !(ans % 2))
return 0;
if ((ans % 2) && (!(ans >> 4) || !(ans >> 1) % 2))
return 0;
return 1;
}

int ans(int i, int now) {
int a;
switch (i)
{
case 1:{
a = ans(2, 0);
if(a)
return a;
else
return ans(2, 1);
break;
}
case 2:{
a = ans(3, (now << 1));
if(a)
return a;
else
return ans(3, (now << 1) + 1);
break;
}
case 3:{
a = ans(4, now << 2);
if(a)
return a;
else
return ans(4, (now << 1) + 1);
break;
}
case 4:{
a = ans(5, now << 2);
if(a)
return a;
else
return ans(5, (now << 1) + 1);
break;
}
case 5:{
now = (now << 1);
if (check(now))
return now;
else if (check(++now))
return now;
else
return 0;
break;
}
default:
break;
}
}

int main () {
int Ans;
Ans = ans(1, 0);
if (Ans >> 4)
printf(“A”);
if ((Ans >> 3) % 2)
printf(“B”);
if ((Ans >> 2) % 2)
printf(“C”);
if ((Ans >> 1) % 2)
printf(“D”);
if ((Ans >> 0) % 2)
printf(“E”);
printf(“\n”);
return 0;
}

精彩评论

eject