复读是坠吊的!(x
题目大意
根据模板产生不同层数的图形
解题思路
可以考虑,大的绘图由小的模块组成,每个小的模块都可以再次拆分,直到每个小的模块只剩下单个字符,因此考虑使用递归。递归考虑为给定当前的模块的起始绘图区域,交给下一个递归去做。
递归表达式
进行递归之前,需要明确需要使用的变量。
解释
N是原始图形origin的大小,Q是层次。
进行递归,如果Q==1,直接在传入的x和y部分按照origin绘制即可。
如果Q>1,首先缩小问题范围,层次变为Q-1,而还要找到对应的起始位置。所以计算出下一层问题的size,即pow(N,Q-1),然后用size确定当前这个要递归元素的开始位置,调用draw(Q-1,x+isize,y+jsize),这样能把小一层的问题定位到对应的位置上。
代码
#include <bits/stdc++.h> using namespace std; int N; char origin[7][7]; char pic[3005][3005]; void draw(int Q,int x,int y){ if(Q==1){ for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ pic[x+i][y+j] = origin[i][j]; } } } else{ int size = pow(N,Q-1); for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ if(origin[i][j]!=' '){ draw(Q-1,x+i*size,y+j*size); } } } } } int main(){ while(scanf("%d",&N)){ if(N==0){ break; } getchar(); for(int i=0;i<3005;i++){ for(int j=0;j<3005;j++){ pic[i][j]=' '; } } for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ origin[i][j] = getchar(); } getchar(); } int Q; scanf("%d",&Q); int length = (int) pow(N,Q); draw(Q,0,0); for(int i=0;i<length;i++){ for(int j=0;j<length;j++){ cout<<pic[i][j]; } cout<<endl; } } return 0; }