蓝桥杯第一届国际赛真题A~E

阅读: 评论:0

蓝桥杯第一届国际赛真题A~E

蓝桥杯第一届国际赛真题A~E

蓝桥杯第一届国际赛真题A~E

蓝桥杯第一届国际赛真题A~E

个人练习,仅供参考,如有错误,请指正~哈哈。

目录

  1. 试题A仓库布局
  2. 试题B网站扩张
  3. 试题C基因配对 ;
  4. 试题D捕鱼达人 ;
  5. 试题E希尔伯特曲线

试题A:仓库布局:


#include<stdio.h>
int main(){int amount(int,int,int,int);int n,m,x,y,z,f;printf("please in n&m(空格隔开):");scanf("%d %d",&n,&m);x=n%3;//把每三行空间看成一组,x为余下的行数y=n/3;f=m%6;//把每六列看成一组,f为余下的列数z=m/6;printf("%d",amount(x,y,z,f));return 0;
}
int amount(int x,int y,int z,int f){int n=5*z+f;//n为当前列数下每一行的柜子数int c=0;switch(x){case 2:c=n*(1+2*y);break;//当剩余行数为2时,最多再摆一行柜子default:c=2*n*y;break;//当剩余行数为0或1时,无法再摆下柜子}return c;

试题B:网站扩张

#include<stdio.h>
int main(){void func(int,int*,int);int n,i,m=0;int* p=&m;printf("please in n:");//n为天数scanf("%d",&n);func(1,p,n);printf("%dn",*p);return 0;
}
void func(int x,int* p,int n){int i;for(i=x;i<=n;i++){if(i==(x+7)){func(i,p,n);/*对这个用户来说,第八天时邀请一名新用户(即再调用一次函数),并向函数传入当前天数i,这天记为新用户使用网站的第一天*/}if((i-(x+7))%3==0&&(i-(x+7))>0){func(i,p,n);//在第11、14天等又可邀请新用户}}*p+=1;//每调用一次函数,总人数加一
}


#include<stdio.h>
int main(){void verse(char*);int cmp(char*,char*);char l[50],s[20];char* p1=l;char* p2=s;printf("please in sequenceL:");gets(l);printf("please in sequenceS:");gets(s);verse(l);if(cmp(l,s)==0)printf("not found");else printf("found,from No.%d character",cmp(l,s));return 0;
} 
void verse(char*p){while(*p!=''){switch(*p){case 'A':*p='T';break;case 'T':*p='A';break;case 'C':*p='G';break;case 'G':*p='C';break;}p++;}
}
int cmp(char*p1,char*p3){int i=0,flag;char* p2,*p4;while(*p1!=''){p2=p3;p4=p1;flag=0;if(*p2==*p4) {while(*(++p4)!=''&&*(++p2)!='') {if(*p4==*p2){flag=1;continue;}else {flag=0;break;}}}	p1++;i++;if(flag==1)break;}if (flag==0)i=0;	return i;
}

试题D:捕鱼达人



捕鱼达人参考思路: link.

#include<stdio.h>
#include<stlib.h>
int main(){void findsum(int [],int ,int [][2],int);int func(int [],int,int [][2],int);int bigstsum(int [],int );int n,r,i,j,b,c,n1,result,x;int (*a)[2];int* sum;int* flag;printf("please in n r:");scanf("%d %d",&n,&r);a=(int(*)[2])malloc(sizeof(int)*n*2);/*用数组指针动态申请二维数组储存各点坐标*/sum=(int*)malloc(sizeof(int)*n);flag=(int*)malloc(sizeof(int)*n);printf("请输入各个点的坐标:");for(i=0;i<n;i++){scanf("%d %d",&a[i][0],&a[i][1]);}findsum(sum,n,a,r);//记下捕每个点能包含的点数量在sum[n]数组里x=bigstsum(sum,n);//先找到一网能包含最多鱼的那条鱼n1=n;for(i=0;i<n;i++){if(i==x){flag[i]=1;//表示第i条鱼被捕n1--;continue;}else{flag[i]=0;//初始值为0,表示还未捕b=(a[i][0]-a[x][0]);c=(a[i][1]-a[x][1]);if(b*b+c*c<=r*r){ //被网包含,即可捕flag[i]=1;n1--;         //鱼总数减少}}}for(i=0;i<n;i++){if(flag[i]=1){       //被捕的鱼,删除它的flag;for(j=i;j<n-1;j++){flag[j]=flag[j+1];}}}result=func(flag,n1,a,r)+1;/*接下来func函数按顺序捕鱼,返回还需捕的次数*/printf("捕%d次n",result);free(a);free(sum);free(flag);return 0;
}
int func(int flag[],int n1,int a[][2],int r){int i,j,b,c,n=0;for(i=0;i<n1;i++){if(flag[i]==1)continue;else{flag[i]=1;n+=1;for(j=i+1;j<n1;j++){b=(a[i][0]-a[j][0]);c=(a[i][1]-a[j][1]);if((b*b+c*c)<=r*r)flag[j]=1;}}}return n;
}
void findsum(int sum[],int x,int a[][2],int r){int i,j,b,c;for(i=0;i<x;i++){sum[i]=0;for(j=0;j<x;j++){if(i==j)continue;else{b=(a[i][0]-a[j][0]);c=(a[i][1]-a[j][1]);if((b*b+c*c)<=r*r)sum[i]+=1;}}}
}
int bigstsum(int sum[],int x){int maxr=0;int i;for(i=1;i<x;i++){if(sum[i]>sum[maxr]){maxr=i;}}return i;
}


试题E:希尔伯特曲线

#include<stdio.h>
int main(){long int power(int,int);int p,p1,m,n,i,a,b,x=0,y=0;printf("要找第几个点的坐标:");scanf("%d",&p);p1=p;for(i=1;;i++){if((m=power(4,i))<=p&&p<power(4,i+1)){n=i;break;}}n=i;      /*以下的代码是我找数学规律来做的,可能不是最好的,就酱吧哈哈哈*/while(n>0){if(n!=1){a=p/m;b=p%m;;p=b;if(b!=0)a+=1;elseb=4;switch(a){case 1:	x+=0;y+=0;			 			break;case 2:	x+=0;y+=power(2,n)-1;			break;case 3:	x+=power(2,n)-1;y+=power(2,n)-1;break;case 4:	x+=power(2,n)-10;y+=0;			break;}n--;m=power(4,n);	}if(n!=1)continue;else{a=p/m;b=p%m;if(b!=0)a+=1;elseb=4; switch(a){case 1:switch(b){case 1:if(x==0){x+=0;}else{x+=1;}if(y==0){y+=0;}else{y+=1;}break;case 2:if(x==0){x+=1;}else{x+=2;}if(y==0){y+=0;}else{y+=1;}break;case 3:if(x==0){x+=1;}else{x+=2;}if(y==0){y+=1;}else{y+=2;}break;case 4:if(x==0){x+=0;}else{x+=1;}if(y==0){y+=1;}else{y+=2;}break;};break;case 2:switch(b){case 1:if(x==0){x+=0;}else{x+=1;}if(y==0){y+=2;}else{y+=3;}break;case 2:if(x==0){x+=0;}else{x+=1;}if(y==0){y+=3;}else{y+=4;}break;case 3:if(x==0){x+=1;}else{x+=2;}if(y==0){y+=3;}else{y+=4;}break;case 4:if(x==0){x+=1;}else{x+=2;}if(y==0){y+=2;}else{y+=3;}break;};break;case 3:switch(b){case 1:if(x==0){x+=2;}else{x+=3;}if(y==0){y+=2;}else{y+=3;}break;case 2:if(x==0){x+=2;}else{x+=3;}if(y==0){y+=3;}else{y+=4;}break;case 3:if(x==0){x+=3;}else{x+=4;}if(y==0){y+=3;}else{y+=4;}break;case 4:if(x==0){x+=3;}else{x+=4;}if(y==0){y+=2;}else{y+=3;}break;};break;case 4:switch(b){case 1:if(x==0){x+=3;}else{x+=4;}if(y==0){y+=1;}else{y+=2;}break;case 2:if(x==0){x+=2;}else{x+=3;}if(y==0){y+=1;}else{y+=2;}break;case 3:if(x==0){x+=2;}else{x+=3;}if(y==0){y+=0;}else{y+=1;}break;case 4:if(x==0){x+=3;}else{x+=4;}if(y==0){y+=0;}else{y+=1;}break;};break;}break;}	}	printf("第%d点的坐标:%d %dn",p1,x,y);return 0;
}
long int power(int a,int b){int i,c=1;for(i=0;i<b;i++){c*=a;}return c;
}

希尔伯特曲线是递归的,但是我好像不会用递归来做,所以找的规律,放在while循环中做的;
运行结果(我这里直接输入第几个点,题中要求也要输入n,我在做的时候忘了):

本文发布于:2024-02-05 06:46:47,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170726619064053.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:第一届   真题   国际   蓝桥杯
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23