GOC练习题

5月17号训练

正五边形

image-20240606154122660

1
2
3
4
5
6
7
int main(){
p.hide().c(14).size(5);
for(int i=0;i<5;i++){
p. fd(100).rt(72);
}
return 0;
}

十二边形

image-20240606154504506

1
2
3
4
5
6
7
8
9
10
11
int main(){
p.c(14).size(5);
for(int i=0;i<12;i++){
p.fd(100).rt(30);
}
for(int i=0;i<12;i++){
p.lt(60).fd(100).rt(120).fd(100);
p.lt(30);
}
return 0;
}

五角星

image-20240606154518976

1
2
3
4
5
6
7
int main(){
p. hide().c(14).size(5);
for(int i=0;i<5;i++){
p.fd(100).rt(144);
}
return 0;
}

空心五角星

image-20240606154532113

1
2
3
4
5
6
7
int main(){
p. hide().c(14).size(5);
for(int i=0;i<5;i++){
p.fd(100).rt(144).fd(100).lt(72);
}
return 0;
}

空心十角星

image-20240606154555829

1
2
3
4
5
6
7
int main(){
p. hide().c(14).size(5);
for(int i=0;i<10;i++){
p.fd(100).rt(72).fd(100).lt(36);
}
return 0;
}

十五色十五边形

image-20240606154612994

1
2
3
4
5
6
7
int main(){
p. hide().size(5);
for(int i=0;i<15;i++){
p.c(i).fd(50).rt(24);
}
return 0;
}

十五色针

image-20240606154626568

1
2
3
4
5
6
7
8
int main(){
p. hide().size(5);
for(int i=0;i<15;i++){
p. down().c(i).fd(100).up();
p.bk(100).rt(24);
}
return 0;
}

彩色回文

image-20240606154637790

1
2
3
4
5
6
7
int main(){
p. hide().size(5);
for(int i=0;i<15;i++){
p.c(i).fd(i*10+10).rt(90);
}
return 0;
}

花朵

image-20240606154935992

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(){
p. speed(9).picU(0).up();//设置画图方向随着笔头
p.rt(90).a(100,180,1);
//画叶于下半部分
p.moveTo(0,-100).lt(90).a(100,90,0);
//完成右边叶子上半部分 1/4个圆
p.moveTo(-100,-100).a(100,90,1);
//完成左边叶于上半部分
p.moveTo(0,-200).down().fd(300).hide();
//移动到花的尾端向上画茎
//画花朵 十二个正十二边形
for(int i=0;i<12;i++){
for(int j=0;j<12;j++){
p. fd(25).rt(30);
}
p.rt(30);//每个正十二边形差角
}
return 0;
}

5月23号训练

32968.写数字

image-20240605130939907

1
2
3
4
5
6
7
8
int main(){
p.hide().size(20);
p.lt(90).c(7).fd(50).rt(90);
p.c(9).fd(50).rt(90).c(11).fd(50);
p.lt(90).c(8).fd(50).lt(90).c(4).fd(50);
p.up().bk(100).rt(90).down().c(13).bk(100);
return 0;
}

79208.有色正多边形

image-20240605130954374

1
2
3
4
5
6
7
8
9
int main(){
int a,b;
cin >> a>>b;
p.hide().c(b);
for(int i=0;i<a;i++){
p.rt(360.0/a).fd(100);
}
return 0;
}

32971.圆堆堆

image-20240605131004932

1
2
3
4
5
6
7
8
9
10
int main(){
p.rt(90).up().size(10).hide();
for(int i=3;i>0;i--){
for(int j=0;j<i;j++){
p.fd(50).c(3-i).o(50).fd(50);
}
p.bk(i*100).lt(60).fd(100).rt(60);
}
return 0;
}

32972.冰壶场地

image-20240605131012721

1
2
3
4
5
6
7
8
int main(){
p.r(600,140,1).text("我爱编程",2,50).hide();
p. moveTo(450/2,0);
p. oo(40).oo(30, 15).oo(22,1).oo(12,15);
p.moveTo(-450/2,0);
p.oo(40).oo(30, 15).oo(22,1).oo(12,15);
return 0;
}

image-20240605131023499

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(){
int a,b;
double c;
cin>>a>>b;
c = a*a+b*b;
for(int i=1;i<=4;i++){
p.fd(a).lt(90);
}
p.rt(90);
for(int i=1;i<=4;i++){
p.fd(b).rt(90);
}
//判断C是否为正整数
int res =0;
for(int i=1;i<=150;i++){
if(c/i==i) res=1;
}
if(res==1){
p.fd(b).lineTo(0,a).lineTo(a,a+b).lineTo(a+b,b).lineTo(b,0);
}
return 0;
}

7811.变色花

image-20240605131031044

1
2
3
4
5
6
7
8
int main(){
p.picU(0).hide();
for(int i=0;i<4;i++){
p.ee(30,80,14).rt(45);
}
p.oo(50,6);
return 0;
}

32977.柱状成绩单

image-20240605131040657

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(){
int score[8],max;
for(int i=1;i<=8;i++){
cin>>score[i];
if(max<score[i]) max=score[i]; //找到最大值
}
for(int i=1;i<=8;i++){
p.moveTo(-80*4+80*(i-1),score[i]/2);//移动到柱状图最中间画矩形
//score>=180 绿
if(score[i] >= 180){
p.rr(50,score[i],12);
}else{
p.rr(50,score[i],1);
}
if(score[i] == max){
p.up().fd(score[i]/2+30).oo(30,12);
}
}
return 0;
}

3-4年级训练

7744.波浪线

image-20240605165508576

1
2
3
4
5
6
7
int main(){
p.rt(60);
for(int i=0;i<11;i++){
p.fd(20).rt(60).fd(20).lt(60);
}
return 0;
}

7751.彩色线条

image-20240605165517504

1
2
3
4
5
6
7
int main(){
for(int i=0;i<13;i++){
p.moveTo(30*i,0);
p.c(i).size(i+1).fd(150).bk(150);
}
return 0;
}

7835.颜色多变的灯笼

image-20240605165520004

1
2
3
4
5
6
7
8
9
int main(){
int a;
cin >> a;
p.up();
for(int i=0;i<5;i++){
p.fd(10).oo(10,a).fd(10);
}
return 0;
}

8356.正十六边形的花

image-20240605165523752

1
2
3
4
5
6
7
8
9
10
11
12
int main(){
p.c(9).size(4);
for(int i=0;i<16;i++){
for(int j=0;j<3;j++){
p.fd(50).lt(120);
}
p.fd(50).rt(360/16.0);
}
p.moveTo(125,25);
p.text("我爱编程",9,30);
return 0;
}

6674.排排蛋

image-20240605165535013

1
2
3
4
5
6
7
int main(){
p.rt(90).up().moveTo(-300,0);
for(int i=0;i<6;i++){
p.fd(50).ee(50,30,5).oo(15,1).fd(50);
}
return 0;
}

6376.彩色摩天轮

image-20240605165540669

1
2
3
4
5
6
int main(){
for(int i=0;i<15;i++){
p.c(i).fd(200).oo(40).bk(200).rt(360/15.0);
}
return 0;
}

5-6年级训练

6007.彩色的阶梯

image-20240605165547570

1
2
3
4
5
6
int main(){
for(int i=0;i<10;i++){
p.c(i).fd(10+5*i).rt(90).fd(10+5*i).lt(90);
}
return 0;
}

7750.橙片

image-20240605165556449

1
2
3
4
5
6
7
8
9
10
11
12
int main(){
p.oo(100,14).oo(90,13).size(5).c(14);
for(int i=0;i<10;i++){
p.fd(90).bk(90).rt(36);
}
p.up();
for(int i=0;i<5;i++){
p.rt(18).fd(55).oo(5,15).bk(55);
p.rt(54);
}
return 0;
}

225.彩色花朵

image-20240605165600622

1
2
3
4
5
6
7
8
9
10
11
12
int main(){
p.picU(0); //开启图形按照笔方向画
p.up();
for(int i=0;i<9;i++){
p.fd(130).ee(20,100,13).bk(130).rt(40);
}
p.rt(20);
for(int i=0;i<9;i++){
p.fd(110).ee(30,80,14).bk(110).rt(40);
}
return 0;
}

5013.限速60标志

image-20240605165603961

1
2
3
4
5
int main(){
p.oo(150,15).oo(140,1).oo(120,15);
p.text("60",0,180);
return 0;
}

6041.三角魔方

image-20240605165606965

1
2
3
4
5
6
7
8
9
10
int main(){
for(int i=0;i<5;i++){
p.lt(30);
for(int j=0;j<4;j++){
p.fd(100-10*i).rt(120);
}
p.fd(50-5*i).lt(60+10*i);
}
return 0;
}

1264:合唱队形

image-20240605165618653

初中训练

6041.三角魔方

image-20240605165624948

1
2
3
4
5
6
7
8
9
10
11
int main(){
p.rt(30).speed(8);
for(int i=0;i<9;i++){
for(int j=0;j<3;j++){
p.fd(30).rt(120);
}
p.rt(60).fd(30).lt(60);
}
p.lt(60).fd(30).lt(60).fd(240);
return 0;
}

5013.限速60标志

image-20240605165629967

1
2
3
4
5
int main(){
p.oo(150,15).oo(140,1).oo(120,15);
p.text("60",0,180);
return 0;
}

6685.收集落叶

image-20240605165633218

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(){
p.c(6);
for(int i=0;i<4;i++){
p.moveTo(70*i,0);
p.ee(30,100,13);
p.fd(100);
for(int j=0;j<4;j++){
if(j%2==0){
p.bk(40).lt(30).fd(30).bk(30).rt(30);
}
else{
p.bk(40).rt(30).fd(30).bk(30).lt(30);
}
}
p.bk(70);

}
return 0;
}

4992.十一边形花环

image-20240605165637766

1
2
3
4
5
6
7
int main(){
p.c(9);
for(int i=0;i<11;i++){
p.fd(80).oo(15,5).bk(40).rt(360/11.0);
}
return 0;
}

2369.腾图

image-20240605165650910

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(){
p.c(12).speed(9).hide();
int n,a,b,o;
cin >> n;
for(int i=0;i<6;i++){
p.fd(n).rt(60);
}
p.rt(90);
a = 2*sqrt(n*n-(n/2.0)*(n/2.0));
for(int i=0;i<3;i++){
p.fd(a).lt(120);
}
b = a /2.0;
p.fd(b).lt(60);
for(int i=0;i<3;i++){
p.fd(b).rt(30).fd(n/2.0).bk(n/2.0).lt(150);
}
o = b/2.0/sqrt(3);
p.up().fd(b/2.0).lt(90).fd(o).o(o);

return 0;
}

7674. 两科成绩

image-20240605165701314

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main(){
int f[20],g[20],h[20];
int n;
cin >> n;
for(int i=0;i<n;i++){
cin >> f[i] >> g[i];
}
p.rt(90);
for(int i=0;i<n;i++){
int max,maxxb;
for(int j=0;j<n;j++){
int sum =f[j]+g[j];
if(max < sum || (sum == max && f[j] > f[maxxb])){
max = f[j]+g[j];
maxxb=j;
}
}
p.moveTo(0,-20*i);
p.c(14).fd(f[maxxb]).c(11).fd(g[maxxb]);
f[maxxb]=g[maxxb]=0;
}
return 0;
}

6月5号训练

34079.数据统计

image-20240605122524462

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main(){
int n,x,a[5];
cin >> n;
p.hide();
for(int i=0;i<n;i++){
cin >> x;
if(x>=90) a[0]++;
else if(x>=80) a[1]++;
else if(x>=70) a[2]++;
else if(x>=60) a[3]++;
else a[4]++;
}
for(int i=0;i<5;i++){
p.moveTo(20*i,a[i]*5).rr(20,a[i]*10,i+1);
}
return 0;
}

12512.冠状病毒

image-20240605110349609

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(){
p.oo(80,3).o(100).picU(0);
int n;
cin >> n;
for(int i=0;i<n;i++){
if(i%2==0){
p.up().fd(100).down().fd(20).ee(20,10,1);
}else{
p.up().fd(100).down().fd(40).ee(20,10,0);
}
p.moveTo(0,0).rt(360.0/n);

}
return 0;
}

20857.多个正多边形

image-20240605114854116

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(){
// n多边形数量 k 正多边形
p.speed(9);
int n,k;
cin >> n >> k;
for(int i=0;i<n;i++) {
p.fd(100);
//内角和 180*(k-2) 内角 180*(k-2) / k
p.lt(90.0*(k-2)/k); //转角的一半
for(int j=0;j<k;j++){
p.fd(30).rt(360.0/k);
}
p.rt(90.0*(k-2)/k).moveTo(0,0).rt(360.0/n);
}
return 0;
}

398.山峰

image-20240605120208173

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main(){
int n,a[11];
cin >> n;
for(int i=0;i<n;i++){
cin >> a[i];
}
cout << a[n];
p.moveTo(0,a[0]/2.0).r(20,a[0]);
for(int i=1;i<n;i++){
//山峰不为首个和最后一个
if(a[i]>a[i+1] && a[i]>a[i-1] && i!=n-1){
p.moveTo(20*i,a[i]/2.0).rr(20,a[i]);
}
p.moveTo(20*i,a[i]/2.0).r(20,a[i]);
}
return 0;
}

585.数字表示

image-20240605120850116

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main(){
int n,m;
cin >> n;
//计算数字长度 m
p.lt(90).up().hide();
for (int i=n; i > 0; i = i/ 10) {
m++;
}
for(int i=0;i<m;i++){
p.oo(20,n%10).fd(40);
n = n / 10;
}
return 0;
}

394.织鱼网

image-20240606175134744

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(){
int m,n;
cin >>m >>n;
p.rt(45);
for(int i=0;i<m;i++){
for(int j=0;j<2*n;j++){
//1画上波浪
p. fd(50).rt (90).fd(50).lt (90);
//旋转画下波浪
if(j==n-1) p.rt(180);
}
//回到画正方形组的初始位置再次循环
p.up().lt(90).fd(50).rt(90).fd(50).lt(180).down();
}
return 0;
}

2023年青科赛真题

2356两个八分音符

image-20240623173955916

1
2
3
4
5
6
7
8
int main(){
p.c(0);
p.oo(20);
p.rt(90).fd(20).lt(90).size(4).fd(100);
p.rt(70).size(10).fd(100).rt(110).size(4).fd(100);
p.rt(90).fd(20).oo(20);
return 0;
}

2357变化的正三角形

image-20240628153145817

1
2
3
4
5
6
7
8
9
10
int main(){
for(int i=0;i<5;i++){
p.lt(30);
for(int j=0;j<4;j++){
p.fd(100-10*i).rt(120);
}
p.fd(50-5*i).lt(60+10*i);
}
return 0;
}

2358偶数车辆和

image-20240623174050751

image-20240623174057642

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(){
int n,a[10],sum;
cin >> n;
for(int i=0;i<n;i++){
cin >> a[i];
}
for(int i=0;i<n;i++){
p.moveTo(40*i,a[i]/2.0);
if(a[i] % 2==0){
sum += a[i]*20;
p.rr(20,a[i],1);
}else{
p.rr(20,a[i],0);
}
}
//红面积 sum
//长(2*n-1)*20=40n-20
p.moveTo(20*n-20,-1*sum/(80*n-40));
p.rr(40*n-20,sum/(40*n-20),3);
return 0;
}

2359矩形外框A

image-20240628153308344

image-20240628153357201

image-20240628153409419

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
int myMax(int a,int b){
if(a>b) return a;
else return b;
}
int main(){
int a[4],X,Y,max,res;
for(int i=0;i<4;i++){
cin >> a[i];
if(max<a[i]) max=a[i];
}
p.r(100,100).up();
p.moveTo(-50,50);
for(int i=0;i<4;i++){
p.rt(90).o(a[i]);
if(a[i]==max){
X=getX();
Y=getY();
res=i;
}
p.fd(100);
}
if(a[res]>a[(res+1)%4]+100 && a[res]>a[(res+2)%4]+100&&a[res]>a[(res+3)%4]+100){//最大值很大
p.moveTo(X,Y);
p.r(max*2,max*2);
}else{
if(a[(res+1)%4]<a[(res+2)%4] && a[(res+2)%4] > a[(res+3)%4]){//对角线
cout << "对角线";
p.moveTo(X/abs(X)*(50+max-(a[res]+a[(res+2)%4]+100)/2.0),Y/abs(Y)*(50+max-(a[res]+a[(res+2)%4]+100)/2.0));
p.r((a[res]+a[(res+2)%4]+100),(a[res]+a[(res+2)%4]+100));
}else{
//长为长 短为宽
if((res%2==0&&a[(res+1)%4]>a[(res+2)%4] && a[(res+1)%4] > a[(res+3)%4])||(res%2==1&&a[(res+3)%4]>a[(res+1)%4] && a[(res+3)%4] > a[(res+2)%4])){
p.moveTo(X/abs(X)*(50+max-(max+a[(res+1+2*(res%2))%4]+100)/2.0),Y/abs(Y)*(50+max-(max+myMax(a[(res+2-res%2)%4],a[(res+3-res%2)%4])+100)/2.0));
p.r(max+a[(res+1+2*(res%2))%4]+100,max+myMax(a[(res+2-res%2)%4],a[(res+3-res%2)%4])+100);
}else{
//长为宽 短为长
p.moveTo(X/abs(X)*(50+max-(max+myMax(a[(res+1+res%2)%4],a[(res+2+res%2)%4])+100)/2.0),Y/abs(Y)*(50+max-(max+a[(res+3-2*(res%2))%4]+100)/2.0));
p.r(max+myMax(a[(res+1+res%2)%4],a[(res+2+res%2)%4])+100,max+a[(res+3-2*(res%2))%4]+100);
}

}
}
return 0;
}

2360绿色正三角形

image-20240623174108830

1
2
3
4
5
6
7
8
9
10
int main(){
p.c(10).rt(30);
for(int i=0;i<6;i++) {
if(i==3){
p.rt(60).fd(75).lt(120);
}
p.fd(150).rt(120);
}
return 0;
}

2361黑色印记

image-20240628154114419

1
2
3
4
5
6
7
8
9
10
11
int main(){
p.picU(0).up();
p.oo(283,0);
p.rr(400,400,15);
p.rt(45).rr(400,400,15);
for(int i=0;i<8;i++){
p.fd(150).rt(45).rr(90,90,0).lt(45).bk(150);
p.rt(45);
}
return 0;
}

2362挑选日期

image-20240623174130144

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(){
p.rt(90).up();
int a[5];
for(int i=0;i<5;i++){
cin >> a[i];
}
for(int i=0;i<5;i++){
if((a[i]+1)%7==6){
p.oo(20,3);
}else if((a[i]+1)%7==0){
p.oo(20,4);
}else{
p.oo(20,1);
}
p.fd(40);
}
return 0;
}

2363车辆统计

image-20240623175620853

image-20240623175632380

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main(){
double avg,sum=0,n,a[10],max=0;
p.hide().speed(9);
cin >> n;
for(int i=0;i<n;i++){
cin >> a[i];
sum += a[i];
if(max < a[i]) max=a[i];
}
avg = sum / n;
for(int i=0;i<n;i++){
p.moveTo(20*i,0).fd(a[i]);
if(max==a[i]) p.up().fd(20).o(20,1).down();
}
p.moveTo(0,avg).rt(90).c(1).fd(20*n-20);
return 0;
}

2364统计排水量

image-20240628154344906

image-20240628154553404

1
2
3
4
5
6
7
8
9
10
11
12
13
int main(){
double sum=0,n,a[15],max=0;
p.hide().speed(9);
cin >> n;
for(int i=0;i<n;i++){
cin >> a[i];
if(max < a[i]) max=a[i];
}
for(int i=0;i<n;i++){
p.moveTo(20*i,a[i]/max*150).r(20,a[i]/max*300);
}
return 0;
}

2365矩形外框B

image-20240623180651332

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
int myMax(int a,int b){
if(a>b) return a;
else return b;
}
int main(){
int a[4],X,Y,max,res;
for(int i=0;i<4;i++){
cin >> a[i];
if(max<a[i]) max=a[i];
}
p.r(100,100).up();
p.moveTo(-50,50);
for(int i=0;i<4;i++){
p.rt(90).o(a[i]);
if(a[i]==max){
X=getX();
Y=getY();
res=i;
}
p.fd(100);
}
if(a[res]>a[(res+1)%4]+100 && a[res]>a[(res+2)%4]+100&&a[res]>a[(res+3)%4]+100){//最大值很大
p.moveTo(X,Y);
p.r(max*2,max*2);
}else{
if(a[(res+1)%4]<a[(res+2)%4] && a[(res+2)%4] > a[(res+3)%4]){//对角线
p.moveTo(X/abs(X)*(50+max-(a[res]+a[(res+2)%4]+100)/2.0),Y/abs(Y)*(50+max-(a[res]+a[(res+2)%4]+100)/2.0));
p.r((a[res]+a[(res+2)%4]+100),(a[res]+a[(res+2)%4]+100));
}else{
//长为长 短为宽
if((res%2==0&&a[(res+1)%4]>a[(res+2)%4] && a[(res+1)%4] > a[(res+3)%4])||(res%2==1&&a[(res+3)%4]>a[(res+1)%4] && a[(res+3)%4] > a[(res+2)%4])){
p.moveTo(X/abs(X)*(50+max-(max+a[(res+1+2*(res%2))%4]+100)/2.0),Y/abs(Y)*(50+max-(max+myMax(a[(res+2-res%2)%4],a[(res+3-res%2)%4])+100)/2.0));
p.r(max+a[(res+1+2*(res%2))%4]+100,max+myMax(a[(res+2-res%2)%4],a[(res+3-res%2)%4])+100);
}else{
//长为宽 短为长
p.moveTo(X/abs(X)*(50+max-(max+myMax(a[(res+1+res%2)%4],a[(res+2+res%2)%4])+100)/2.0),Y/abs(Y)*(50+max-(max+a[(res+3-2*(res%2))%4]+100)/2.0));
p.r(max+myMax(a[(res+1+res%2)%4],a[(res+2+res%2)%4])+100,max+a[(res+3-2*(res%2))%4]+100);
}

}
}
return 0;
}

2366彩色花朵

image-20240628155229283

1
2
3
4
5
6
7
8
9
10
11
12
int main(){
p.picU(0); //开启图形按照笔方向画
p.up();
for(int i=0;i<9;i++){
p.fd(130).ee(20,100,13).bk(130).rt(40);
}
p.rt(20);
for(int i=0;i<9;i++){
p.fd(110).ee(30,80,14).bk(110).rt(40);
}
return 0;
}

2367变化的正方形

image-20240628151021609

image-20240628150954532

1
2
3
4
5
6
7
8
9
10
11
int main(){
int n;
cin >> n;
for(int i=0;i<n;i++){
p.c(i);
for(int j=0;j<6;j++){
p.fd(200-20*i).lt(90);
}
}
return 0;
}

2368彩色图形

image-20240628150229616

image-20240628150316832

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(){
p.moveTo(-300,300).up().hide().rt(90);
int n;
cin >> n;
for(int i=0;i<n;i++){
for(int j=i;j<n+i;j++){ // 4 5 6 7 8
if(j>n-1){
p.oo(20,(j-1)%(n-1));
}else{
p.oo(20,j);

}
p.fd(40);
}
p.moveTo(-300,260-40*i);
}
return 0;
}

2369腾图

image-20240623174555103

image-20240628165336683

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(){
p.c(12).speed(9).hide();
int n,a,b,o;
cin >> n;
for(int i=0;i<6;i++){
p.fd(n).rt(60);
}
p.rt(90);
a = 2*sqrt(n*n-(n/2.0)*(n/2.0));
for(int i=0;i<3;i++){
p.fd(a).lt(120);
}
b = a /2.0;
p.fd(b).lt(60);
for(int i=0;i<3;i++){
p.fd(b).rt(30).fd(n/2.0).bk(n/2.0).lt(150);
}
o = b/2.0/sqrt(3);
p.up().fd(b/2.0).lt(90).fd(o).o(o);

return 0;
}

2370变化的立方体

image-20240623175645692

image-20240623175654138

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 函数:计算两个数的最大公约数
int gcd(int a, int b) {
while (b != 0) {
int temp = a % b;
a = b;
b = temp;
}
return a;
}

// 函数:计算三个数的最大公约数
int gcdOfThree(int a, int b, int c) {
// 先计算前两个数的GCD
int gcdAB = gcd(a, b);
// 再用这个结果与第三个数计算GCD
return gcd(gcdAB, c);
}

int main(){
int a[3],b;
p.speed(6);
for(int i=0;i<3;i++){
cin >> a[i];
}
b=gcdOfThree(a[0],a[1],a[2]);
for(int i=0;i<=a[0]/b;i++){
p.moveTo(-b*i,-a[2]);
p.fd(a[2]).rt(45).fd(a[1]).lt(45);
}
p.rt(90);
for(int i=0;i<=a[1]/b;i++){
p.fd(a[0]).rt(90).fd(a[2]);
p.up().bk(a[2]).rt(90).fd(a[0]).lt(45).fd(b).lt(135).down();
}
for(int i=0;i<a[2]/b;i++){
p.moveTo(-a[0],-b*i-b);
p.fd(a[0]).lt(45).fd(a[1]).rt(45);
}
return 0;
}

2371矩形外框C

image-20240628152010556

image-20240628152027315

历史训练题

32979勾股定理

image-20240730110554625

image-20240730110600657

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(){
int a,b;
double c;
cin>>a>>b;
c = a*a+b*b;
for(int i=1;i<=4;i++){
p.fd(a).lt(90);
}
p.rt(90);
for(int i=1;i<=4;i++){
p.fd(b).rt(90);
}
//判断C是否为正整数
int res =0;
for(int i=1;i<=150;i++){
if(c/i==i) res=1;
}
if(res==1){
p.fd(b).lineTo(0,a).lineTo(a,a+b).lineTo(a+b,b).lineTo(b,0);
}
return 0;
}

5815最多边的多边形

image-20240730110735594

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
int main(){
int in[100],n;
cin >> n;
for(int i=0;i<n;i++){
cin >> in[i];
}
int index =0;
int index2 = 1;
int num = 0;
int count = 1;
int countTemp = 1;
int temp=in[0];
while (index<n-1){
if ((in[index] != num && ((in[index2] != temp && in[index] != temp) || index==0)) || index2==n-1){
if (in[index] == in[index2]){
if(index!=0) in[index2] = temp;
countTemp++;
}
if (index2==n-1){
if (count < countTemp){
count = countTemp;
num=in[index];
}
index++;
index2 = index +1;
countTemp = 1;
}else{
index2++;
}
}else{
if (in[index] == temp){
index++;
index2 = index + 1;
}else{
index2++;
}

}

}
for(int i=0;i<count;i++){
p.fd(num).rt(360.0/count);
}
return 0;
}

21815正多边形

image-20240730111554341

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(){

int n;
cin >> n;
for(int i=0;i<n;i++){
if(i%2==0){
p.fd(50).lt(120);
p.fd(50).lt(120);
p.fd(50).lt(120);
}else{
p.fd(50).lt(90);
p.fd(50).lt(90);
p.fd(50).lt(90);
p.fd(50).lt(90);
}
p.fd(50).rt(360.0/n);
}
return 0;
}

391螺旋线

image-20240730113112259

image-20240730113154447

1
2
3
4
5
6
7
8
9
10
11
12
int main(){
int n;
cin >> n;
p.oo(5,1);
for(int i=0;i<n;i++){
for(int j=0;j<i+1;j++){
p.fd(20).oo(5,1);
}
p.rt(90);
}
return 0;
}

114轮廓

image-20240730113612348

image-20240730113636319

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(){
int a[10];
p.speed(5);
for(int i=0;i<10;i++){
cin >> a[i];
}
p.fd(a[0]).rt(90);
for(int i=0;i<9;i++){
p.fd(20);
p.lt(90).fd(a[i+1]-a[i]).rt(90);
}
p.fd(20).rt(90).fd(a[9]);
p.rt(90).fd(200);
return 0;
}

20860折线图

image-20240730114946554

image-20240730114958937

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main(){
int a[40],n;
cin >> n;
for(int i=0;i<n;i++){
cin >> a[i];
}
p.moveTo(0,a[0]).oo(5,0);
for(int i=1;i<n;i++){
if(a[i]<a[i-1]){
p.c(3);
}else{
p.c(1);
}
p.lineTo(20*i,a[i]).oo(5,0);
}
p.moveTo(0,a[0]).oo(5,0);
for(int i=1;i<n;i++){
p.moveTo(20*i,a[i]).oo(5,0);
}
return 0;
}

151巧克力甜度

image-20240730115741857

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int main(){
int n,s,a[100];
cin >> n >> s;
for(int i=0;i<n;i++){
cin >> a[i];
}
for (int i = 0; i < n-1; i++)
{
for (int j = 0; j < n-i-1; j++)
{
if (a[j] > a[j+1])
{
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
int i=0;
while(s-a[i]>=0){
s-= a[i];
i++;
}
p.rr(i*5,i*5);
return 0;
}

178靠近

image-20240730120938257

image-20240730120954363

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int myMax(int a,int b){
if(a>b) return a;
return b;
}
int myMin(int a,int b){
if(a<b) return a;
return b;
}
int main(){
p.up().hide();
int a,b,c,d;
cin >> a>>b>>c>>d;
p.fd(b/2.0).rr(b,b,0);//黑
p.fd(b/2.0+a/2.0).rr(a,a,1);//红
p.moveTo(0,0).rt(90);
//1.紫和绿相加小于黑
if(c+d<=b){
p.fd(b/2.0+myMax(c,d)/2.0).lt(90);
//画绿
p.fd(d/2.0).rr(d,d,10);
//画紫
p.fd(c/2.0+d/2.0).rr(c,c,11);
}else{
//黑色小于绿色
if(b<=d && c<=d || b<a && d<c){
p.fd(myMax(c,d)/2.0+myMax(a,b)/2.0).lt(90);
p.fd(d/2.0).rr(d,d,10);
p.fd(c/2.0+d/2.0).rr(c,c,11);
}else if(b<=d && c>d){
p.fd(c/2.0+myMin(a,b)/2.0).lt(90);
p.fd(d/2.0).rr(d,d,10);
p.fd(c/2.0+d/2.0).rr(c,c,11);
}else{
p.fd(myMin(c,d)/2.0+myMax(a,b)/2.0).lt(90);
p.fd(d/2.0).rr(d,d,10);
p.fd(c/2.0+d/2.0).rr(c,c,11);
}
}
return 0;
}

631寻宝游戏

image-20240730121636944

image-20240730121655053

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(){
int n,m,a[100];
cin >> n>>m;
int cc=1;
for(int i=1;i<=n;i++){
a[cc]=1;
cc = cc+ m+1;
if(cc>n) cc=cc%n;
}
for(int i=1;i<=n;i++){
p.up().fd(200);
if(a[i]==1){
p.oo(30,1);
}else{
p.o(30);
}
p.bk(200).rt(360.0/n);
}
return 0;
}

527坐船

image-20240730122157169

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(){
int n,w,s=0,t=0,a[50];
cin>>n>>w;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
if((s+a[i])<=w){
s+=a[i];
}
else{
p.moveTo(s/2.0,t*-40).rr(s,20);
t++;
s=0;
s+=a[i];
}
}
p.moveTo(s/2.0,t*-40).rr(s,20);
return 0;
}

565飞越太空山

image-20240730122700766

image-20240730122710501

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int main(){
int n,a[100];
cin >> n;
for(int i=0;i<n;i++){
cin >> a[i];
}
int count=1;//满十为一趟
int people=0; //满十清0
//7 20 18 15 14 5 30 21 25 10 50 25 26
for(int i=0;i<n;i++){
if(a[i]>=10*count){
people++;
}
if(people==10){
people=0;
count++;
}
}
cout << people;
for(int i=0;i<10;i++){
if(i%2==0){
p.moveTo(-50*(i/2),0);
}else{
p.moveTo(-50*((i-1)/2),-50);
}
if(i==people){
p.oo(20,1);
}else{
p.o(20);
}
p.r(50,50);
}
return 0;
}

399水杯

image-20240730122911730

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int main(){
int a,b,c;
cin >> a>>b>>c;
p.moveTo(0,a/2.0).r(50,a,1);
p.moveTo(60,b/2.0).r(50,b,3);
p.moveTo(120,c/2.0).r(50,c,4);
a -= b; //红色水减绿色水
if(a>0){//红色水比绿色多 剩下的给蓝色
p.moveTo(60,b/2.0).rr(50,b,3);
//红色比绿色加蓝色都多
if(a>c){
p.moveTo(120,c/2.0).rr(50,c,4);
a-=c;
p.moveTo(0,a/2.0).rr(50,a,1);
}else{
//剩下的给蓝色刚好够
p.moveTo(120,a/2.0).rr(50,a,4);
}

}else{
//红色比绿色少,所有的都给绿色
p.moveTo(60,(a+b)/2.0).rr(50,a+b,3);
}
return 0;
}

386山洞

image-20240730123055536

image-20240730123106611

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(){
int n,a[100],t=1;
cin >> n;
for(int i=1;i<=n;i++){
a[i]=0;
}
a[1]=1;
for(int i=2;i<=51;i++){
while(t>=n){
t%=n;
}
t+=i;
a[t]=1;
}
for(int i=1;i<=n;i++){
if(a[i]==0) p.down().fd(100).up().fd(20).oo(20,i).bk(120).rt(360.0/n);
else p.down().fd(100).up().fd(20).o(20,i).bk(120).rt(360.0/n);
}
return 0;
}

185砖头

image-20240730123254417

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int main(){
int n;
cin >> n;
if(n<90){
p.rt(90).fd(100);
p.rt(90).fd(100);
p.rt(90).fd(100);
p.rt(90).fd(100);
p.rt(90-n).fd(100);
p.rt(n).fd(100);
p.rt(180-n).fd(100);
p.lt(90-n).fd(100);
p.rt(90-n).bk(100);
p.lt(90-n).bk(100);
}else{
p.lt(90).fd(100);
p.lt(90).fd(100);
p.lt(90).fd(100);
p.lt(90).fd(100);
p.rt(90-n).fd(100);
p.lt(180-n).fd(100);
p.rt(180-n).bk(100);
p.lt(90-n).bk(100);
p.rt(90-n).fd(100);
p.lt(90-n).fd(100);
}
return 0;
}

115同心圆

image-20240730123353710

1
2
3
4
5
6
7
8
9
10
11
12
int main(){
int a[10],max;
for(int i=0;i<10;i++){
cin >> a[i];
if(max<a[i]) max=a[i];
}
p.oo(max,0);
for(int i=0;i<10;i++){
p.o(a[i],1);
}
return 0;
}

116手机号码

image-20240730123456426

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(){
int N,S,T;
cin >> N >> S>>T;
string a="13300303003";
int x = (T/11-S/11-1)*5;
//起始值不被十一整除
if(S%11==0){
x++;
x+=5;//中间重复号码会少1
}else{
//起始值最近的11倍数头到尾
for (int i = S%11-1; i <11; i++) {
if (a[i] == '3') x++;
}
}
//结尾值最近的11倍数头到尾
for (int i = 0; i <=T%11-1; i++) {
if (a[i] == '3') x++;
}
p.oo(20+x%199,x%15);
return 0;
}

2745叠套的多边形

image-20240730123547061

1
2
3
4
5
6
7
8
int main(){
for(int i=0;i<6;i++){
for(int j=0;j<i+3;j++){
p.fd(100).rt(360.0/(i+3));
}
}
return 0;
}

378找规律

image-20240730123653945

1
2
3
4
5
6
7
8
9
10
11
12
//378
int plus(int n){
int sum=1;
for(int i=1;i<n;i++) sum=sum+i;
return sum;
}
int main(){
int n;
cin>>n;
p.oo(50,plus(n)%16);
return 0;
}

172拼图

image-20240730123758270

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(){
int n,i,max=0,min=114514;
cin>>n;
int a[n],b[n];
for(i=0;i<n;i++){
cin>>a[i];
if(a[i]<min)min=a[i];
}
for(i=0;i<n;i++){
cin>>b[i];
if(b[i]>max)max=b[i];
}
p.rr(min,min,10).moveTo(0,min/2+max).oo(max,11);
return 0;
}

2024年青科赛压轴题

image-20240730110531248

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//计算两数的差(正数)
int cha(int a,int b){
if(a-b>0) return a-b;
else return b-a;
}
//300 100 250 0
//-200 300 250 -100
//300 -100 -100 -200
int main(){
int a,b,y1,y2,jd;
cin >> a>>b>>y1>>y2;
p.moveTo(0,y1).lineTo(0,y2).c(1);
//两点连接,计算经过y轴时候的交点
//交点在y1~y2的范围则需要绕着走,不然直接连接两点
jd=a-(a-b)/2.0;//A点和B点连接线经过y轴的交点的y轴点
if(jd>y2&&jd<y1){//有挡板
//计算过上端点距离 勾股定理
double julis = sqrt(cha(a,y1)*cha(a,y1)+300*300)+sqrt(cha(b,y1)*cha(b,y1)+300*300);
cout << julis<<endl;
//计算过下端点距离
double julix = sqrt(cha(a,y2)*cha(a,y2)+300*300)+sqrt(cha(b,y2)*cha(b,y2)+300*300);
cout << julix;
//走上端点
if(julix>julis){
p.moveTo(-300,a).lineTo(0,y1).lineTo(300,b);
}else{
//走下端点
p.moveTo(-300,a).lineTo(0,y2).lineTo(300,b);
}
}else{
p.moveTo(-300,a).lineTo(300,b);
}
return 0;
}