第8关 - 2017NHOI-GoC比赛

image.png

158.(2017NHOI-GOC测评)第1题 鱼形(fish)

题目描述

小P同学喜欢拼七巧板类的游戏,他想使用3个边长是100的正三角形拼出下面的图形,请你帮忙使用GoC编程绘制。

image.png

题解

int main(){   
    p.rt(30).speed(5);
    for(int i=0;i<3;i++) 
    {
        p.fd(100).rt(120);
    }
    p.rt(120);
    for(int i=0;i<3;i++) 
    {
        p.fd(100).lt(120);
    }   
    p.fd(200).rt(120).fd(100).rt(120).fd(100) ;  
    return 0;
}

159.(2017NHOI-GOC测评)第2题 栏杆(rail)

题目描述

有了鱼,小P觉得水塘边应该安装些栏杆。他设计了如下图的黑、红2种颜色组成的栏杆,请你帮忙使用GoC编程绘制。

image.png

注意:每个线段的长度都是20,上面红色尖顶的角度是60度。

题解

int main(){
    for(int i=1;i<=8;i++){
        p.c(0)
            .bk(20).rt(90).fd(20).lt(90).fd(20);
        
        if(i==8) break; // 最后一次不画 矩形
        
        p.c(1)
            .rt(30).fd(20).lt(60).bk(20).rt(30);
    }
    
    return 0;
}

160.(2017NHOI-GOC测评)第3题 花形(flower)

题目描述

看到你绘制的漂亮图形,小P觉得水面上再配些花形就更满意了。他想使用不同的正多边形均匀地围成一圈来拼成花朵。 为了研究什么颜色、和形状的图更好看,小P需要编制一个通用的程序:键盘输入颜色、正多边形边数和正多边形个数,就可以画出相应的花朵。 注意:所有正多边形每条边的长度都是50。

输入格式 一行用空格隔开的3个正整数:分别表示颜色编号、正多边形边数和正多边形个数。

输出格式 相应的花形。

输入/输出例子1

输入:

1 3 4

输出:

image.png

输入/输出例子2

输入:

3 4 5

输出:

image.png

输入/输出例子3

输入:

6 5 6

输出:

image.png

题解

int main(){
    
    int c,b,s;
    cin >> c >> b >> s;
    p.c(c);
    for(int i = 1; i<= s;i++)
    {
        for(int j=0;j<=b;j++){
            p.fd(50).lt(360.0/b);
        }
        p.rt(360.0/b).rt(360.0/s);
    }    
    
    return 0;
}

161.(2017NHOI-GOC测评)第4题 桶形(bucket)

题目描述

小P还想配个水桶,可是水桶太难画了,于是他设计了下面样式的桶形:

image.png

上图中,图形的上面是一个11号颜色的椭圆(横半径是100,纵半径是50),桶的侧面高是200、颜色号为10。) 为了研究什么形状的桶更好看,小P需要编制一个通用的程序:键盘输入椭圆的横半径和纵半径、桶侧面的高,就可以画出相应的桶形。

输入格式 一行用空格隔开的3个正整数:分别表示椭圆的宽和高及桶侧面的高。

输出格式 相应的桶形。 注意:椭圆的颜色号为11,桶的侧面颜色号为10。

输入/输出例子1

输入:

40 10 100

输出:

image.png

输入/输出例子2

输入:

50 40 60

输出:

image.png

题解

int main(){
    int rw,rh,h;
    cin >> rw >> rh >> h;
    p.up()
        .bk(h/2)
        .ee(rw,rh,10).
        fd(h/2);
    
    p.rr(rw*2,h,10).fd(h/2);
    p.ee(rw,rh,11);

    return 0;
}

162.(2017NHOI-GOC测评)第5题 莲花(lotus)

题目描述

小P请小C来欣赏他的作品,小C赞叹不已。不过小C也有自己的绝招,拿出了一朵莲花图形:

image.png

小P惊呆了!请教小C这个图的GoC画法,小C教给他几个分析步骤: 第一步:化繁为简,分解问题。 先考虑一片花瓣的问题。

image.png

第二步:继续分解。 一片花瓣是2个弧线组成的。

image.png

第三步:一个弧线。 大家知道正360边形几乎就是一个圆,如果只画四分之一,那就是圆的四分之一弧线,正是我们需要的花瓣的一个弧线。具体见下表:

image.png

最后,小C建议把上面分析过程倒过来,逐步组合,你就可以利用上面提供的程序片段A画出指定的莲花图形! 由于具体的细节小C没有讲解,小P必须耐心研究来完成这个任务。

输入格式 一行用空格隔开的2个正整数:分别表示颜色编号和花瓣片数。

输出格式 (调用程序片段A画出)相应的莲花图形。

输入/输出例子1

输入:

1 3

输出:

image.png

输入/输出例子2

输入:

11 5

输出:

image.png

题解

int main(){
    
    int col,n;
    cin >> col >> n;
    p.c(col);
    for(int i=0;i<n;i++){
        for(int j=0;j<90;j++){
            p.fd(1).rt(1);
        }
        p.rt(90);
        for(int j=0;j<90;j++){
            p.fd(1).rt(1);
        }
        p.rt(90);
        
        p.rt(360.0/n);
    }
    
    
    return 0;
}

163.(2017NHOI-GOC测评)第6题 最长单调(max)

题目描述

水塘边有一排N棵高度不相同的树,小P想用宽度为20的矩形表示他们。不过小C不喜欢表示树的这些图形有高低起伏,因此想找出高度是连续上升或连续下降的数量最多的树来画相应的矩形。 例如,N=7,树的高度为: 100 30 40 80 60 90 50 。 其中(30 40 80)这一段是单调上升的,并且树的数量最多(3棵)。用3个宽度是20,高度分别是30、40、80的矩形画出它们:

image.png

输入格式 第一行:一个正整数N(N<20),表示有N棵树。 第二行:用空格隔开的N个各个不同的正整数,依次表示每棵树的高度。

输出格式 画出高度单调的、数量最多的树对应的矩形。(保证只有一个最长的答案)

输入/输出例子1

输入:

7

60 30 50 100 50 80 40

输出:

image.png

输入/输出例子2

输入:

6

10 20 90 80 60 50

输出:

image.png

题型

int main()
{
    int n,a[25],max=-1,s=1,sum;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        sum=1;
        for(int j=i+1;j<=n;j++){
            if(a[j]>a[j-1]) sum++;
            else break;
        }
        if(sum>max){
            max=sum;
            s=i;
        }
    }
    for(int i=1;i<=n;i++){
        sum=1;
        for(int j=i+1;j<=n;j++){
            if(a[j]<a[j-1]) sum++;
            else break;
        }
        if(sum>max){
            max=sum;
            s=i;
        }
    }
    for(int i=1;i<=max;i++){
        p.fd(a[s+i-1]).rt(90).fd(20).rt(90)
            .fd(a[s+i-1]).rt(90).fd(20).lt(180);
        p.fd(20).lt(90);
    }
    return 0;
}