复读是坠吊的!(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;
} 
京公网安备 11010502036488号