第5关 - 2019NH教师GoC组测试题

image.png

693.1. 小丑的帽子(2019NH教师GoC)

题目描述 如下图,三角形边长100,球的半径20。请编程画出这个图形。

image.png

题解

int main(){
    p.oo(20);
    p.bk(20)
        .rt(150).fd(100)
        .rt(120).fd(100)
        .rt(120).fd(100);

    return 0;
}

694.2. 四周花边(2019NH教师GoC)

题目描述 如下图,四边的颜色号为0、1、2、3,每个小段的线段长度是20。请编程画出这个图形。

image.png

题解

为了方便大家理解梯形路线的重复规律,这里不使用二重循环,大家可以自行优化。


int main(){
    for(int i = 0; i<4; i++){
        p.c(i)
            .fd(20).rt(90)
            .fd(20).lt(90)
            
            .fd(20).rt(90)
            .fd(20).lt(90)
            
            .fd(20).rt(90)
            .fd(20).lt(90)
            
            .fd(20).rt(90)
            .fd(20).lt(90)
            
            .fd(20).rt(90)
            .fd(20).lt(90)
            
            .fd(20).rt(90)
            .fd(20).lt(90)
            
            .rt(90);
    }

    return 0;
}

695.3. 外半径与内半径(2019NH教师GoC)

题目描述

有n个不同的正整数,如果使用他们作为半径画圆,会有n个圆。例如:n=5时,有5个不同正整数:100 20 120 80 160,图形如下:

image.png 现在希望只是画最外的圆和最里的圆,比如上面的图就变为:

image.png

输入格式 第一行1个整数n;(2<=n<=20)

第二行n个不同的正整数(不超过300),空格隔开。

输出格式 正确的图形。

输入/输出例子1

输入:

4

112 150 50 90

输出:

image.png

696.4. 相同数(2019NH教师GoC)

题目描述

小G和小C是好朋友,他们正一起并肩登走路。走路很无聊,他们想了一个游戏,小G边走边报数:1 2 3 1 2 3 1 2 3 …. ;小C边走边报数: 1 2 1 2 1 2 1 2 …. 。如果某一步他们报的数相同,就会觉得很碰巧。

在一条红色(1号颜色)直线上,每隔25画一个为半径10的圆或边长20的正方形表示脚印:如果某一步小G和小C报的数相同就用圆表示,否则就用正方形表示。

输入格式 一行1个正整数n,表示他们走的步数。n<=15

输出格式 正确的图形

输入/输出例子1

输入:

10

输出:

image.png

题解

本题重点是解决循环中最后一次循环,fd(25) 多绘制一次的问题。

方法一:

int main(){
    int n;
    cin >> n;
    int l = 25 * (n-1);
    p.rt(90).c(1)
        .fd(l).bk(l)
        .up();
    
    for(int i = 0; i<n;i++){
        if(i%3 == i%2){
            p.oo(10);
        }else{
            p.rr(20,20);
        }
        p.fd(25);
    }
    
    return 0;
}

方法二:

int main(){
    int n;
    cin >> n;
    p.rt(90).c(1);
    for(int i = 0; i<n;i++){
               
        if(i%3 == i%2){
            p.oo(10);
        }else{
            p.rr(20,20);
        }
        if(i<n-1){
            p.fd(25);
        }
        
    }
    
    return 0;
}

方法三:

int main(){
    int n;
    cin >> n;
    p.rt(90).c(1);
    for(int i = 0; i<n;i++){
        if(i == (n-1)){
            p.up();
        }
        
        if(i%3 == i%2){
            p.oo(10);
        }else{
            p.rr(20,20);
        }
        
        p.fd(25);
    }
    
    return 0;
}

697.5. 倒背如流(2019NH教师GoC)

题目描述

黑板上老师写了n给不同的整数(都不包含数字0),小C想考考大家的“倒背如流”能力,从右向左读数字。按照这个次序,用这些颠倒的数为高,从左到右间隔20画n条垂直的线。用绿色(3号颜色)画。

输入格式 第一行1个整数n;(2<=n<=20)

第二行n个不同的正整数,空格隔开。

输出格式 正确的图形。

输入/输出例子1

输入:

4

112 231 251 19

输出:

image.png

样例解释

先画长度是91的线,后面依次是152、132、211的。

本题用到了数字翻转功能,使用求余取商的方法再重新拼接数字。 数列反转使用 反向绘图的小技巧,原数列可以看成从左向右的方向,而翻转后可以看成从右向左方向

题解

int main(){
    cinWin();
    p.c(3);
    
    int n ;
    cin >> n;
    for(int i = 0;i < n ; i++){
        int newNum = 0,tmp,num;
        cin >> tmp;
        // 求翻转数
        while(tmp){
            num = tmp % 10;             
            tmp = tmp / 10;
            
            newNum = newNum*10 + num;
        }
       
        cout << newNum << " ";
        // 反向输出,即从右往左画线
        p.moveTo(-20*i,0).fd(newNum).bk(newNum);
        
    }
    
    return 0;
}

698.6. 盘绕(2019NH教师GoC)

题目描述

在一个n*n的方格(边长30)迷宫上,通道从左上角开始,顺时针环绕,逐步向里面盘绕。下面用数字标识了一个6*6的迷宫环绕次序。

image.png

现在,小G按照这个环绕次序走了m步,把到达的每一个方格的中点用12号颜色半径为5的实心圆表示,并依次用线连接起来,就成为一个盘绕的线。请编程画出这个盘绕的线。

输入格式 第一行2个正整数n、m。n<=10, m<=n*n。

输出格式 正确的图形。

输入/输出例子1

输入:

4 16

输出:

image.png

输入/输出例子2

输入:

6 26

输出:

image.png

题解(待优化)

int main(){
    cinWin();
	int n,a,b,m;
    cin >> n >> m;
	a=1;
	b= 30;
	p.rt(90).c(12);
	for(int i = 0; i< n; i++){
		int len = n-1 - i*2;
		if(len==0){
			//p.oo(5).hide();
			return 0;
		}

		for(int k=0;k<4;k++){
			for(int j=0;j<len;j++){
				p.oo(5);
				if(a<m && j < len -1){
					p.fd(b);
				}
				a++;
				if(a > m ){
					p.hide();
					return 0;
				}
			}
			if(k < 3){
				p.fd(b).rt(90);
			}
			else{
				p.rt(90).fd(b);
			}
		}

	}
}

方法二:

回形矩阵 n,最大数量为n*n 所以,大循环使用n 来控制,每次走一个 L 形阶梯,进行顺时针环绕,就可以依次完成。

再使用特判断,第一个 fd(30) 抬笔不画线。

image.png

int main() {
    cinWin();
    int n, m;
    cin >> n >> m;

    int len = n;
    int cnt = 0;

    p.rt(90).c(12).hide().up();
    for (int j = 0; j < n; j++) {
        // 先画一个 L 形 阶梯,
        len  = n  - j;
        for(int i = 0; i < len; i++){
            cnt ++;
            if(cnt > 1) p.down();
            if(cnt > m) return 0;
            p.fd(30).oo(5);
        }
        p.rt(90);
        for(int i = 0; i < len-1; i++){
            cnt ++;
            if(cnt > m) return 0;
            p.fd(30).oo(5);
        }
        p.rt(90);
        
    }
    return 0;
}