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

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\n" , 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\n" , a);
                         printf ( "小兔 :%d\n" , b);
                         printf ( "小猫 :%d\n" , c);
                         printf ( "小猴 :%d\n" , d);
                         printf ( "小鹿 :%d\n" , 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\n" , a);
                             printf ( "b is %d\n" , b);
                             printf ( "c is %d\n" , c);
                             printf ( "d is %d\n" , d);
                         }
                     }
                 }
             }
         }
     }
     return  0;
}

输出结果:

a is 3

b is 1

c is 4

d is 2

逻辑推理题的解题思路一般采用多重循环,穷举所有的可能情况,将给出的条件转换为C语言中的逻辑判断表达式,打印出符合条件的选项。

你可能感兴趣的:(面经)