第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;  
}