第七届蓝桥杯程序设计大赛题目及答案.docx
- 文档编号:10251709
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:31
- 大小:77.21KB
第七届蓝桥杯程序设计大赛题目及答案.docx
《第七届蓝桥杯程序设计大赛题目及答案.docx》由会员分享,可在线阅读,更多相关《第七届蓝桥杯程序设计大赛题目及答案.docx(31页珍藏版)》请在冰豆网上搜索。
第七届蓝桥杯程序设计大赛题目及答案
第七届省赛
1.网友年龄
某君新认识一网友。
当问及年龄时,他的网友说:
“我的年龄是个2位数,我比儿子大27岁,如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄”
请你计算:
网友的年龄一共有多少种可能情况?
提示:
30岁就是其中一种可能哦.
请填写表示可能情况的种数。
注意:
你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
7
x-y=3
2.生日蜡烛
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛现在算起来,他一共吹熄了236根蜡烛。
请问,他从多少岁开始过生日party的?
请填写他开始过生日party的年龄数。
注意:
你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
26#include
intmain(){
inti,j;
intsum=0;for(i=1;i<=100;i++){//年龄
sum=0;for(j=i;j<=100;j++){//蜡烛数sum=sum+j;
if(sum==236){cout<
break;
}
}
}
3.方格填数
如下的10个格子
填入0~9的数字。
要求:
连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:
你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
//用dfs求
#include
constintmaxn=4;
intmp[maxn][maxn];
intflag[10];
intans=0;
intinit(){
memset(mp,-10,sizeofmp);memset(flag,0,sizeofflag);
}
intfx[4]={0,-1,-1,-1},fy[4]={-1,-1,0,1};
intcheck(inti,intj){
for(intf=0;f<4;f++){
if(abs(mp[i][j]-mp[i+fx[f]][j+fy[f]])!
=1||i+fx[f]<1||j+fy[f]>4||j+fy[f]<1)continue;
else
return0;
}
return1;
}
voiddfs(inti,intj){
if(i==3&&j==4){
ans++;
return;
}
for(intnum=0;num<=9;num++){
if(!
flag[num]){mp[i][j]=num;flag[num]=1;if(check(i,j))if(j==4)dfs(i+1,1);
else
dfs(i,j+1);flag[num]=0;
}
}
}
intmain(){
init();
dfs(1,2);
cout< } //暴力求解 #include usingnamespacestd; intans=0; voidswap(int*a,int*b) { int*c; c=a; a=b; b=c; } intf(inta[])//判断这种排列组合是否符合题意{ if(a[0]-a[4]==-1||a[0]-a[4]==1)return0; if(a[3]-a[4]==-1||a[3]-a[4]==1)return0; if(a[5]-a[4]==-1||a[5]-a[4]==1)return0; if(a[7]-a[4]==-1||a[7]-a[4]==1) return0; if(a[8]-a[4]==-1||a[8]-a[4]==1) return0; if(a[9]-a[4]==-1||a[9]-a[4]==1) return0; if(a[1]-a[4]==-1||a[1]-a[4]==1) return0; if(a[1]-a[5]==-1||a[1]-a[5]==1) return0; if(a[1]-a[6]==-1||a[1]-a[6]==1) return0; if(a[0]-a[5]==-1||a[0]-a[5]==1) return0; if(a[2]-a[5]==-1||a[2]-a[5]==1) return0; if(a[8]-a[5]==-1||a[8]-a[5]==1) return0; if(a[9]-a[5]==-1||a[9]-a[5]==1) return0; if(a[6]-a[5]==-1||a[6]-a[5]==1) return0; if(a[6]-a[9]==-1||a[6]-a[9]==1) return0; if(a[6]-a[2]==-1||a[6]-a[2]==1) return0; if(a[3]-a[0]==-1||a[3]-a[0]==1) return0; if(a[3]-a[7]==-1||a[3]-a[7]==1) return0; if(a[8]-a[7]==-1||a[8]-a[7]==1) return0; if(a[8]-a[3]==-1||a[8]-a[3]==1) return0; if(a[9]-a[8]==-1||a[9]-a[8]==1) return0; if(a[1]-a[0]==-1||a[1]-a[0]==1) return0; if(a[1]-a[2]==-1||a[1]-a[2]==1) return0; } 列举出0-9所有的组合进行判断 voidperm(inta[],intm,intlen)// { if(m==len-1) { if(f(a))ans++; return; } for(inti=m;i { swap(a[m],a[i]);perm(a,m+1,len);swap(a[m],a[i]); }}intmain(){ inta[10]={0,1,2,3,4,5,6,7,8,9};perm(a,0,10); cout< } 4.快速排序排序在各种场合经常被用到。 快速排序是十分常用的高效率的算法。 其思想是: 先选一个“标尺”,用它把整个队列过一遍筛子,以保证: 其左边的元素都不大于它,其右边的元素都不小于它这样,排序问题就被分割为两个子区间。 再分别对子区间排序就可以了。 下面的代码是一种实现,请分析并填写划线部分缺少的代码。 #include voidswap(inta[],inti,intj) { intt=a[i]; a[i]=a[j]; a[j]=t; } intpartition(inta[],intp,intr){ inti=p;intj=r+1; intx=a[p]; while (1){ while(i while(a[--j]>x); if(i>=j)break; swap(a,i,j);函数功能为能够实现a[i],a[j]值互换} returnj; } voidquicksort(inta[],intp,intr) { if(p } } intmain() { inti; inta[]={5,13,6,24,2,8,19,27,6,12,1,17}; intN=12; quicksort(a,0,N-1); for(i=0;i return0; } 注意: 只填写缺少的内容,不要书写任何题面已有代码或说明性文字swap(a,p,j) #include inta[101],n;//定义全局变量,这两个变量需要在子函数中使用voidquicksort(intleft,intright){ inti,j,t,temp; if(left>right) return; temp=a[left];//temp中存的就是基准数 i=left; j=right; while(i! =j){//顺序很重要,要先从右边开始找 while(a[j]>=temp&&i j--; while(a[i]<=temp&&i i++; if(i {t=a[i];a[i]=a[j];a[j]=t; } } //最终将基准数归位 继续处理左边的,这里是一个递归的过程 继续处理右边的,这里是一个递归的过程 快速排序调用 a[left]=a[i];a[i]=temp;quicksort(left,i-1);//quicksort(i+1,right);// } intmain(){ inti; //读入数据scanf("%d",&n); for(i=1;i<=n;i++)scanf("%d",&a[i]); quicksort(1,n);// //输出排序后的结果for(i=1;i printf("%d\n",a[n]); return0; 5.消除尾一 下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0 如果最后一位是0,则原数字保持不变。 如果采用代码中的测试数据,应该输出: 00000000000000000000000001100111000000000000000000000000011000000000000000000000000000000000110000000000000000000000000000001100请仔细阅读程序,填写划线部分缺少的代码。 #include for(i=0;i<32;i++)printf("%d",(x>>(31-i))&1);printf(""); x=x&(x+1); for(i=0;i<32;i++)printf("%d",(x>>(31-i))&1);printf("\n"); } intmain() { f(103);f(12);return0; } 注意: 只填写缺少的内容,不要书写任何题面已有代码或说明性文字。 x&(x-1)就是把x的二进制-1,或者说把x的二进制最后一个1变成0(c>>(31-i))&1可以分解成: [1]31-i减法,31减去1。 [2]c>>(31-i)c按2进制数值右移(31-i)位 [3]右移后的结果与1做“按位与”计算, 显然c按2进制数值右移(31-i)位后如果最右一位是1,结果输出1,如果最右一位是0,结果输出0。 6.寒假作业现在小学的数学题目也不是那么好玩的。 看看这个寒假作业: □+□=□ □-□=□ □×□=□ □÷□=□ (如果显示不出来,可以参见【图1.jpg】)每个方块代表1~13中的某一个数字,但不能重复比如: 6+7=13 9-8=1 3*4=12 10/2=5 以及: 7+6=13 9-8=1 3*4=12 10/2=5 就算两种解法。 (加法,乘法交换律后算不同的方案)你一共找到了多少种方案? 请填写表示方案数目的整数。 注意: 你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。 分析: 这题本是一个简单的全排列,最容易想到的思路就是对1~13进行全排列,然后取 前12个数字逐一赋值给每个空,在12个数全部确定后,再进行四个等式的判断。 同时,对于C++的STL库有着现成的函数-next_permutation,实现起来也就更加简单了: #include #include #include usingnamespacestd; inta[]={1,2,3,4,5,6,7,8,9,10,11,12,13}; boolcheck() { boolb1=(a[0]+a[1]==a[2]); boolb2=(a[3]-a[4]==a[5]); boolb3=(a[6]*a[7]==a[8]); boolb4=(fabs((a[9]*1.0)/(a[10]*1.0)-a[11]*1.0)<=0.00000000000001); if(b1&&b2&&b3&&b4) returntrue; else returnfalse; } intmain() { intres=0; do { if(check()) { res++; } }while(next_permutation(a,a+13)); cout< return0; } #include #include intres=0; inta[]={1,2,3,4,5,6,7,8,9,10,11,12,13}; voiddfs(intstart) { if(start>=3) 不符合, if(a[0]+a[1]! =a[2])return;//对确定的前面三个数字进行等式判断,就不继续往下搜索 if(start>=6) if(a[3]-a[4]! =a[5])return;//同理进行第二个等式的判断,进行剪枝if(start>=9) if(a[6]*a[7]! =a[8])return;if(start>=12) if(a[11]*a[10]==a[9]){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第七 届蓝桥杯 程序设计 大赛 题目 答案