蓝桥杯——趣味逻辑推理二(2017.2.17)
2017-02-17 17:18
295 查看
一、谁做了好事?
某校有4位同学中的一位做了好事不留名。表扬信来了之后,校长问这4位是谁做的好事。
A说:不是我;
B说:是C;
C说:是D;
D说:他胡说。
已知3个人说的是真话,1个人说的是假话。请根据这些信息,编程找出做了好事的人。
【分析】可设置一个循环,循环4次,将4个同学的话表示成逻辑表达式,进行判断。
源代码:
程序截图:
二、黑与白
有A,B,C,D,E,五人,每人额头上都帖着一张或黑或白的纸。五人对坐,每人都能看见别人的,但看不见自己的。而且黑的撒谎,白的诚实。
A说:“我看见有三个人的是白纸,一人是黑纸”。
B说:“我看见四个人的都是黑纸”。
C说:“我看见有一个人的是白纸,三个人是黑纸”。
D说:“我看见四个人的都是白纸”。
E什么也没有说。
问这5个人谁的额头上贴的是白纸,谁的额头上贴的是黑纸?
【分析】看ABCD四人说的话,分别分析为真话和假话时的情况。
源代码:
程序截图:
三、谁家孩子跑的最慢?
张王李三家各有三个小孩。
一天,三家的九个孩子在一起比赛短跑,规定不分年龄大小,跑第一得9分,跑第二得8分,依此类推。
比赛结果是各家的总分相同,且这些孩子没有同时到达终点的,也没有一家的两个或三个孩子获得相连的名次。
已知获第一名的是李家的孩子,获得第二的是王家的孩子。问获得最后一名的是谁家的孩子?
【分析】此题可抽象为一个“数组填数”模型,其中的已知条件:
(1)该场比赛总分为1+2+3+4+5+6+7+8+9=45分
(2)三家孩子总分相同,故每家孩子得分为15
(3)由于获得第一名的是李家的孩子,获得第二名的是王家的孩子,因此可推知获得第三名的一定是张家的孩子,否则其他两家孩子的总分会超过15
(4)由于这9个孩子的名次不存在并列的情况,且同一家的孩子不会获得相连名次,因此结合(3)可推知获得第4名的一定不是张家的孩子
(5)如果将得分分为三档:高分(7~9)、中等分(4~6)、低分(1~3),可推出每家3个孩子的得分一个为高分、一个为中等分、一个为低分。
因此可用一个二维数组a[3][3]保存三家9个孩子的得分,且每家得分按高分(7~9)、中等分(4~6)、低分(1~3)的顺序保存。
源代码:
某校有4位同学中的一位做了好事不留名。表扬信来了之后,校长问这4位是谁做的好事。
A说:不是我;
B说:是C;
C说:是D;
D说:他胡说。
已知3个人说的是真话,1个人说的是假话。请根据这些信息,编程找出做了好事的人。
【分析】可设置一个循环,循环4次,将4个同学的话表示成逻辑表达式,进行判断。
源代码:
#include <stdio.h> int main() { int i; int a,b,c,d; for(i=1;i<=4;i++) { a=(i!=1); b=(i==3); c=(i==4); d=(i!=4); if(a+b+c+d==3) printf("做好事的人是%c\n",'A'+i-1); } return 0; }
程序截图:
二、黑与白
有A,B,C,D,E,五人,每人额头上都帖着一张或黑或白的纸。五人对坐,每人都能看见别人的,但看不见自己的。而且黑的撒谎,白的诚实。
A说:“我看见有三个人的是白纸,一人是黑纸”。
B说:“我看见四个人的都是黑纸”。
C说:“我看见有一个人的是白纸,三个人是黑纸”。
D说:“我看见四个人的都是白纸”。
E什么也没有说。
问这5个人谁的额头上贴的是白纸,谁的额头上贴的是黑纸?
【分析】看ABCD四人说的话,分别分析为真话和假话时的情况。
源代码:
#include <stdio.h> int main() { int A,B,C,D,E; //贴纸颜色:1-白色 0-黑色 for(A=0;A<=1;A++) { for(B=0;B<=1;B++) { for(C=0;C<=1;C++) { for(D=0;D<=1;D++) { for(E=0;E<=1;E++) { if((A&&B+C+D+E==3||!A&&B+C+D+E!=3) && (B&&A+C+D+E==0||!B&&A+C+D+E!=0) &&
(C&&A+B+D+E==1||!C&&A+B+D+E!=1) && (D&&A+B+C+E==4||!D&&A+B+C+E!=4)) printf("A:%d B:%d C:%d D:%d E:%d\n",A,B,C,D,E); } } } } } return 0; }
程序截图:
三、谁家孩子跑的最慢?
张王李三家各有三个小孩。
一天,三家的九个孩子在一起比赛短跑,规定不分年龄大小,跑第一得9分,跑第二得8分,依此类推。
比赛结果是各家的总分相同,且这些孩子没有同时到达终点的,也没有一家的两个或三个孩子获得相连的名次。
已知获第一名的是李家的孩子,获得第二的是王家的孩子。问获得最后一名的是谁家的孩子?
【分析】此题可抽象为一个“数组填数”模型,其中的已知条件:
(1)该场比赛总分为1+2+3+4+5+6+7+8+9=45分
(2)三家孩子总分相同,故每家孩子得分为15
(3)由于获得第一名的是李家的孩子,获得第二名的是王家的孩子,因此可推知获得第三名的一定是张家的孩子,否则其他两家孩子的总分会超过15
(4)由于这9个孩子的名次不存在并列的情况,且同一家的孩子不会获得相连名次,因此结合(3)可推知获得第4名的一定不是张家的孩子
(5)如果将得分分为三档:高分(7~9)、中等分(4~6)、低分(1~3),可推出每家3个孩子的得分一个为高分、一个为中等分、一个为低分。
因此可用一个二维数组a[3][3]保存三家9个孩子的得分,且每家得分按高分(7~9)、中等分(4~6)、低分(1~3)的顺序保存。
源代码:
#include <stdio.h> int main() { int i,j,score[3][3]; int zhang,wang,li; //zhang wang li用来保存三家得4/5/6分孩子 for(i=0;i<3;i++) //score[0]~score[2]分别存放张王李家三个孩子的分数 score[i][0]=7+i; for(zhang=4;zhang<6;zhang++) //张家孩子在4~6分段可能取值的分数为4或5,不能取6 { for(wang=4;wang<7;wang++) { for(li=4;li<7 && zhang!=wang;li++) { if(li!=zhang && li!=wang) { if(15-zhang-score[0][0]!=15-wang-score[1][0] && 15-zhang-score[0][0]!=15-li-score[2][0] && 15-wang-score[1][0]!=15-li-score[2][0]) //9个孩子名次不存在并列的情况 { score[0][1]=zhang; score[0][2]=15-zhang-7; score[1][1]=wang; score[1][2]=15-wang-8; score[2][1]=li; score[2][2]=15-li-9; } } } } } for(i=0;i<3;i++) //输出三家孩子的成绩 { for(j=0;j<3;j++) printf("%d ",score[i][j]); printf("\n"); } return 0; }程序截图:
相关文章推荐
- 蓝桥杯——趣味逻辑推理一(2017.2.16)
- 蓝桥杯 扶老奶奶过街 (逻辑推理)
- 趣味百题之逻辑推理
- 趣味数学:逻辑推理之计算(两则)
- 趣味逻辑推理
- 蓝桥杯算法提高——扶老奶奶过街(逻辑推理)
- 蓝桥杯——趣味分数问题(2017.2.17)
- 逻辑推理题-用C++实现(3)--谜语博士的难题1
- 考研逻辑整理 - 性质判断及其变形推理
- 面试常见的逻辑推理题
- 逻辑分析推理(戴帽子问题)博弈
- 关于证明和逻辑推理
- 逻辑推理的一般解法思想
- 正确的思考能力之一自省和逻辑推理-
- 如何提高逻辑推理能力和临时应变能力
- 蓝桥杯の趣味算式填符号
- 蓝桥杯 - 第二大整数 (逻辑判断 循环语句)
- 一个逻辑推理问题?
- 第一部分 数理逻辑 第三章 命题逻辑的推理理论
- 趣味推理