2021年寒假每日一題,2017~2019年的省賽真題,
本文內容由倪文迪(華東理工大學計算機系軟體192班)和羅勇軍老師提供,
后面的每日一題,每題發一個新博文,請大家每天看藍橋杯專欄: https://blog.csdn.net/weixin_43914593/category_10721247.html
文章目錄
- 1、題目描述
- 2、說明
2018省賽A組第5題"列印圖形",一道代碼填空題,題目無鏈接,
1、題目描述
如下的程式會在控制臺繪制分形圖(就是整體與區域自相似的圖形),
當n=1,2,3的時候,輸出如下:
請仔細分析程式,并填寫劃線部分缺少的代碼,
n=1時:
o
ooo
o
n=2時:
o
ooo
o
o o o
ooooooooo
o o o
o
ooo
o
n=3時:
o
ooo
o
o o o
ooooooooo
o o o
o
ooo
o
o o o
ooo ooo ooo
o o o
o o o o o o o o o
ooooooooooooooooooooooooooo
o o o o o o o o o
o o o
ooo ooo ooo
o o o
o
ooo
o
o o o
ooooooooo
o o o
o
ooo
o
源程式:
#include <stdio.h>
#include <stdlib.h>
void show(char* buf, int w){
int i,j;
for(i=0; i<w; i++){
for(j=0; j<w; j++){
printf("%c", buf[i*w+j]==0? ' ' : 'o');
}
printf("\n");
}
}
void draw(char* buf, int w, int x, int y, int size){
if(size==1){
buf[y*w+x] = 1;
return;
}
int n = _________________________ ; //填空
draw(buf, w, x, y, n);
draw(buf, w, x-n, y ,n);
draw(buf, w, x+n, y ,n);
draw(buf, w, x, y-n ,n);
draw(buf, w, x, y+n ,n);
}
int main()
{
int N = 3;
int t = 1;
int i;
for(i=0; i<N; i++) t *= 3;
char* buf = (char*)malloc(t*t);
for(i=0; i<t*t; i++) buf[i] = 0;
draw(buf, t, t/2, t/2, t);
show(buf, t);
free(buf);
return 0;
}
注意:只提交劃線部分缺少的代碼,不要抄寫任何已經存在的代碼或符號,
2、說明
??從N=1,2,3的圖形可以看出,每次N加1時,新的圖形是把上一個圖形復制5次,分別放在上、下、左、右、中這5個位置,
??在看代碼之前,我們可以自己思考如何實作,其實方法是很直接的:
(1)圖形用矩陣來表示,存盤每個小圓圈的坐標,
(2)可以確定,應該用遞回來處理不同的N值,畫大小為N的圖時,就遞回5次大小為N-1的圖,放在5個位置,
??有了上面的思路再看代碼,
(1)代碼中用buf[]存圖,它雖然是一維陣列,但實際表示的是矩陣,
(2)遞回函式draw()中遞回畫5個小圖,填空處的n值,是遞回前設定的N-1的小圖的寬度,它是以3倍減小的,答案是:
int n = size/3 ; //填空
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/250253.html
標籤:其他
下一篇:springMVC介紹
