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语言中的逻辑判断表达式,打印出符合条件的选项。