您的位置:首页 > 其它

蓝桥杯——趣味逻辑推理二(2017.2.17)

2017-02-17 17:18 295 查看
一、谁做了好事?

        某校有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;
}
程序截图:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: