复读是坠吊的!(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;
}