【C语言及程序设计】枚举推理法

问题描述:

警察局抓住了A、B、C、D四名盗窃嫌疑犯,其中只有一人是小偷。在审问时,A说:“我不是小偷”;B说:“C是小偷”;C说:“小偷肯定是D”;D说:“C在冤枉好人”。现在已经知道这四人中有三人说的是真话,一人说的是假话。请问到底谁是小偷?
提示:设4个变量a,b,c,d,为0时表示不是小偷,为1时表示是小偷,用四重循环穷举a,b,c,d可能的取值的组合,对每一种组合判断其是否符合题目中给出的约束。最后结论:C是小偷。

对小偷的情况进行枚举:

 1 #include <stdio.h>  
 2 int main()  
 3 {  
 4    int a,b,c,d;  
 5     for(a=1;a>=0;a--) //穷举每个人是否是小偷的所有情况  
 6         for(b=1;b>=0;b--) //1:是小偷 0:不是  
 7             for(c=1;c>=0;c--)  
 8                 for(d=1;d>=0;d--)  
 9                     if((a==0)+(c==1)+(d==1)+(d==0)==3&&a+b+c+d==1) //4人的说法中有3个真的,且只有一个小偷  
10                     {  
11                         printf("A: %d, B: %d, C: %d, D: %d\n", a, b, c, d);  
12                     }  
13     return 0;  
14 }  

对审问描述进行枚举:

 1 #include "stdafx.h"
 2 
 3 int main()
 4 {
 5     int a, b, c, d;
 6     for ( a = 0; a < 2; a++)
 7         for (b = 0; b < 2; b++)
 8             for (c = 0; c < 2; c++) 
 9                 for (d = 0; d < 2; d++) {
10                 
11                     if (
12 
13                         (a + b + c + d) == 3
14                         &&
15                         (!a + b + c - d*c) ==1
16 
17                         )
18                     {
19                         printf("a%d, b%d, c%d, d%d\n",a, b, c, d);
20                     }
21                 }
22 
23     return 0;
24 }

猜你喜欢

转载自www.cnblogs.com/miyazakehime/p/9145250.html
今日推荐