蓝桥杯培训教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

蓝桥杯培训教程一、逻辑推理...................................................................................................................................2二、排序...........................................................................................................................................8三、图形(矩阵)..............................................................................................................................12四、数字变幻.................................................................................................................................21五、数字组合与拆解.....................................................................................................................26六、字符串.....................................................................................................................................45七、数制转换.................................................................................................................................50八、排列组合.................................................................................................................................55九、其它.........................................................................................................................................55十、数据结构.................................................................................................................................72一、逻辑推理1、谁是窃贼:公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎。在回答公安人员的问题中:甲说:“乙没有偷,是丁偷的。”乙说:“我没有偷,是丙偷的。”丙说:“甲没有偷,是乙偷的。”丁说:“我没有偷”请根据这四人的谈话判断谁是盗窃者*问题分析与算法设计假设A、B、C、D分别代表四个人,变量的值为1代表该人是窃贼。由题目已知:四人中仅有一名是窃贼,且这四个人中的每个人要么说真话,要么说假话,而由于甲、乙、丙三人都说了两句话:“X没偷,X偷了”,故不论该人是否说谎,他提到的两人中必有一人是小偷。故在列条件表达式时,可以不关心谁说谎,谁说实话。这样,可以列出下列条件表达式:甲说:”乙没有偷,是丁偷的。”B+D=1乙说:“我没有偷,是丙偷有。”B+C=1丙说:“甲没有偷,是乙偷的。”A+B=1丁说:“我没有偷。”A+B+C+D=1其中丁只说了一句话,无法判定其真假,表达式反映了四人中仅有一名是窃贼的条件。#includestdio.hvoidmain(){inti,j,a[4];for(i=0;i4;i++)/*假定只有第i个人为窃贼*/{for(j=0;j4;j++)/*将第i个人设置为1表示窃贼,其余为0*/if(j==i)a[j]=1;elsea[j]=0;if(a[3]+a[1]==1&&a[1]+a[2]==1&&a[0]+a[1]==1)/*判断条件是否成立*/{printf(Thethiefis);/*成立*/for(j=0;j=3;j++)/*输出计算结果*/if(a[j])printf(%c.,j+'A');printf(\n);}}}2、谁说假话:张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎。现在问:这三人中到底谁说的是真话,谁说的是假话?*问题分析与算法设计分析题目,每个人都有可能说的是真话,也有可能说的是假话,这样就需要对每个人所说的话进行分别判断。假设三个人所说的话的真假用变量A、B、C表示,等于1表示该人说的是真话;表示这个人说的是假话。由题目可以得到:*张三说李四在说谎张三说的是真话:a==1&&b==0或张三说的是假话:a==0&&b==1*李四说王五在说谎李四说的是真话:b==1&&c==0或李四说的是假话:b==0&&c==1*王五说张三和李四都在说谎王五说的是真话:c==1&&a+b==0或王五说的是假话:c==0&&a+b!=0上述三个条件之间是“与”的关系。将表达式进行整理就可得到C语言的表达式:(a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0)穷举每个人说真话或说假话的各种可能情况,代入上述表达式中进行推理运算,使上述表达式均为“真”的情况就是正确的结果。*程序说明与注释#includestdio.hintmain(){inta,b,c;for(a=0;a=1;a++)for(b=0;b=1;b++)for(c=0;c=1;c++)if((a&&!b||!a&&b)&&(b&&!c||!b&&c)&&(c&&a+b==0||!c&&a+b!=0)){printf(Zhangsantolda%s.\n,a?truth:lie);printf(Lisitolda%s.\n,b?truch:lie);printf(Wangwutolda%s.\n,c?truch:lie);}}*运行结果Zhangsantoldalie(张三说假话)Lisitoldatruch.(李四说真话)Wangwutoldalie.(王五说假话)3、诚实族和说谎族:诚实族和说谎族是来自两个荒岛的不同民族,诚实族的人永远说真话,而说谎族的人永远说假话。迷语博士是个聪明的人,他要来判断所遇到的人是来自哪个民族的。迷语博士遇到三个人,知道他们可能是来自诚实族或说谎族的。为了调查这三个人是什么族的,博士分别问了他们的问题,这是他们的对话:问第一个人:“你们是什么族?”,答:“我们之中有两个来自诚实族。”第二个人说:“不要胡说,我们三个人中只有一个是诚实族的。”第三个人听了第二个人的话后说:“对,就是只有一个诚实族的。”请根据他的回答判断他们分别是哪个族的。*问题分析与算法设计假设这三个人分别为A、B、C,若说谎其值为0,若诚实,其值为1。根据题目中三个人的话可分别列出:第一个人:a&&a+b+c==2||!a&&a+b+c!=2第二个人:b&&a+b+c==1||!b&&a+b+c!=1第三个人:c&&a+b+c==1||!c&&a+b+c!=1利用穷举法,可以很容易地推出结果。*程序说明与注释#includestdio.hintmain(){inta,b,c;for(a=0;a=1;a++)/*穷举每个人是说谎还是诚实的全部情况*/for(b=0;b=1;b++)/*说谎:0诚实:1*/for(c=0;c=1;c++)if((a&&a+b+c==2||!a&&a+b+c!=2)/*判断是否满足题意*/&&(b&&a+b+c==1||!b&&a+b+c!=1)&&(c&&a+b+c==1||!c&&a+b+c!=1)){printf(Aisa%s.\n,a?honest:lier);/*输出判断结果*/printf(Bisa%s.\n,b?honest:lier);printf(Cisa%s.\n,c?honest:lier);}}*运行结果Aisalier(说谎族)Bisalier(说谎族)Cisalier(说谎族)4、球队进行比赛两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单*程序说明与注释#includestdio.h#includeconio.hmain(){chari,j,k;/*i是a的对手,j是b的对手,k是c的对手*/for(i='x';i='z';i++)for(j='x';j='z';j++){if(i!=j)for(k='x';k='z';k++){if(i!=k&&j!=k){if(i!='x'&&k!='x'&&k!='z')printf(orderisa--%c\tb--%c\tc--%c\n,i,j,k);}}}getch();}5、谁考了100分已知4位同学中的一位数学考了100分,当小李询问这4位是谁考了100分时,4个人的回答如下:A说:不是我。B说:是CC说:是D。D说:他胡说。已知三个人说的是真话,一个人说的是假话。现在要根据这些信息,找出考100分的人。#includestdio.hvoidmain(){charthisman='';intk,n=0;for(k=1;k=4;k++){thisman=64+k;n=(thisman!='A')+(thisman=='C')+(thisman=='D')+(thisman!='D');if(n==3){printf(得100分的是%c\n,thisman);break;}}if(k4)printf(无解!\n);}6、新郎新娘问题:教堂中来了ABC三个新郎和XYZ三个新娘,问新人中的三位,他们互相与谁结婚。下面是三个人的回答,但全是假话,判断他们谁与谁结婚A说他与X结婚X说她与C结婚C说他与Z结婚#includestdio.hvoidmain(){inta,b,c,n;charx[3]={'X','Y','Z'};for(a=0;a3;a++)for(b=0;b3;b++)if(a!=b){c=3-a-b;n=(a==0)+(c==0)+(c==2);if(n==0)printf(A-%c\tB-%c\tC-%c\n,x[a],x[b],x[c]);}}7、寻找肇事车辆:一辆汽车撞人后逃跑,4个目击者提供如下线索:甲说:牌照第三,第四位相同(从左边数起).乙说:牌号为31xxxx.丙说:牌照第五,第六位相同(从左边数起).丁说:第三位~第六位是一个整数的平方.求出此牌照号码#includestdio.h#includemath.hvoidmain(){inti,j,k,c;for(i=0;i=9;i++)for(j=0;j=9;j++)//if(i!=j)//如果确定三、四位与五六位不同,则用这个语句{k=i*1000+i*100+j*10+j;for(c=0;ck;c++)//for(c=0;c-1sqrt(k);c++)//这个语句更好{if(c*c==k)pr

1 / 76
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功