改善了一下方法
#include<iostream>
#include<math.h>
#include<stdio.h>
using namespace std;
//递归法
//迭代法一层一层的生成效率太慢
//递归图形相当于一棵树,既然这样直接递归判断i,j应该显示什么字母
//然后直接生成即可
char GenerateMapGrid(int i,int j,char* Template,int templateSize,int scale){
//最底层,直接返回对应字符
if(scale==1) return Template[i*templateSize+j];
//上一层的单个空格,到下一层就是一大块空格,所以直接返回空格即可
int gridSize = pow(templateSize,scale-1);
if(Template[i/gridSize*templateSize+j/gridSize]==' ') return ' ';
//是有内容的,直接递归返回
return GenerateMapGrid(i%gridSize,j%gridSize,Template,templateSize,scale-1);
}
int main(){//习题2.4 北京大学 Repeater
int templateSize;
int scale;
string line;
while(cin>>templateSize){
if(templateSize==0) break;
cin.ignore();//cin吃掉数字后还剩下一个\n
char* Template = (char*)malloc(sizeof(char)*templateSize*templateSize);
//生成模版阵列
for(int i=0;i<templateSize;i++){
getline(cin,line);
for(int j=0;j<templateSize;j++){
Template[i*templateSize+j] = line[j];
if(j>=line.size()){//牛客网的oj会吃掉getline字符串末尾的空格
Template[i*templateSize+j] = ' ';
}
}
}
//根据模版阵列生成字符阵列
cin>>scale;
int mapSize = pow(templateSize,scale);
char* map = (char*)malloc(sizeof(char)*mapSize*mapSize);
for(int i=0;i<mapSize;i++){
for(int j=0;j<mapSize;j++){
map[i*mapSize+j] = GenerateMapGrid(i,j,Template,templateSize,scale);
}
}
//打印字符阵列
for(int i=0;i<mapSize;i++){
for(int j=0;j<mapSize;j++){
printf("%c",map[i*mapSize+j]);
}
printf("\n");
}
}
return 0;
}

京公网安备 11010502036488号