改善了一下方法
#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; }