嵌入式linux面试题解析(四)——逻辑推理一

2019-07-13 02:39发布

1、谁是罪犯问题     一位法官在审理一起盗窃案时,对涉及到的四名嫌疑犯A、B、C、D进行了审问。四人分别供述如下:     A:“罪犯在B、C、D三人之中。”     B:“我没有作案,是C偷的。”     C:“在A和D中间有一个是罪犯。”     D:“B说的是事实”     经过充分的调查,证实四人中只有两人说了真话,并且罪犯只有一个。请确定真正的罪犯。 解答:   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include   int main(int argc, char *argv[])  {       //假设A是罪犯       unsigned int killer = 'A';       int flags = 0;//A、B、C、D说真话的值为1,说假话为0,四个人所说真假的和   //假设A、B、C、D都是罪犯,遍历四种可能       for(killer = 'A'; killer <= 'D'; killer++)       {           flags = (killer == 'B' || killer == 'C' || killer == 'D');           flags += (killer == 'C');           flags += (killer == 'A' || killer == 'D');           flags += (killer == 'C');           if(flags == 2)//A、B、C、D中有两个人说的是真话           {               printf("killer is %c ", killer);           }       }           return 0;   } 输出结果: killer is D 2、小狗、小兔、小猫、小猴和小鹿参加百米赛跑,比赛结束后,     小猴说:“我比小猫跑得快。”     小狗说:“小鹿在我的前面冲过了终点线。”     小兔说:“我的名次排在小猴的前面,小狗的后面。”     请根据他们的回答排出名次。 解答: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #include     int main(int argc, char **argv) {     //小狗、小兔、小猫、小猴、小鹿分别定义为a,b,c,d,e     unsigned int a, b, c, d, e;     for(a = 1; a <= 5; a++)     {         for(b = 1; b <= 5; b++)         {             if(a == b)                 continue;             for(c = 1; c <= 5; c++)             {                 if(a == c || b == c)                     continue;                 for(d = 1; d <= 5; d++)                 {                     if(a == d || b == d || c == d)                         continue;                     e = 15 -a -b -c -d;                     if((d < c) && (e < a) && (b < d) && (b > a))                     {                         printf("小狗 :%d ", a);                         printf("小兔 :%d ", b);                         printf("小猫 :%d ", c);                         printf("小猴 :%d ", d);                         printf("小鹿 :%d ", e);                     }                 }             }         }     }     return 0; } 输出结果: 小狗 :2 小兔 :3 小猫 :5 小猴 :4 小鹿 :1 3、甲、乙、丙、丁四人参加一次数学竞赛。赛后,他们四人预测名次的谈话如下:  甲说:“丙得第一,我第三名”;     乙说:“我第一名,丁第四名”;     丙说:“丁第二名,我第三名”;     丁没说话。     当最后结果公布时发现,甲乙丙都只说对了一半,请给出正确的四人名次。 解答: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include     int main(int argc, char **argv) {     //甲乙丙丁分别为a,b,c,d     unsigned int a,b,c,d;     //a为1-4时     for(a = 0; a <= 4; a++)     {         for(b = 0; b <= 4; b++)         {             for(c = 0; c <= 4; c++)             {                 for(d = 0; d <= 4; d++)                 {                     if(a + b + c + d == 10)                     {                         //a,b,c,d的值不能相同                         if(a == b || a == c || a == d || b == c || b == d || c == d)                             continue;                         if(((c == 1)+(a == 3) == 1) && ((b == 1)+(d == 4) == 1) && ((d == 2)+(c == 3) == 1))                         {                             printf("a is %d ", a);                             printf("b is %d ", b);                             printf("c is %d ", c);                             printf("d is %d ", d);                         }                     }                 }             }         }     }     return 0; } 输出结果: a is 3 b is 1 c is 4 d is 2 逻辑推理题的解题思路一般采用多重循环,穷举所有的可能情况,将给出的条件转换为C语言中的逻辑判断表达式,打印出符合条件的选项。