//土尔逊Torson 在2023/2/4 日 编写 #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <string> #include <iostream> using namespace std; char sample[7][7] = { 0 };// 题目中说原始样板图大小不超过 5*5,初始化为零 char outlook[3007][3007] = { 0 };// 题目中说最终图样大小不超过 3000*3000 //char tmplook[3000][3000] = { 0 }; //计算最终图样边长大小 int edgeCompute(int size, int times) { int edgeNum = size; for (int i = 0; i < times - 1; ++i) { edgeNum = edgeNum * size; } return edgeNum; } //绘制最终图样的第二层(最终层),采用递归实现。 //根据原始样板图样的形状决定大的轮廓,再在大轮廓的每一个图样位置绘制更小的原始图样轮廓。 void paint(int size, int duplic, int x, int y) { //int x = 0, y = 0; //最小层绘制原始图 if (duplic == 1) { for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { outlook[x + i][y + j] = sample[i][j]; } } } else { //如果不是最小单元原始样板图,则继续递归的使用自己这个函数 int paint_edge = edgeCompute(size, duplic - 1);//计算每小一层的图样边长大小 for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { if (sample[i][j] != ' ') { paint(size, duplic - 1, x + i * paint_edge, y + j * paint_edge); //递归自己这个函数 } } } } } int main() { int size; //原始样板图大小 int duplic; //复制放大倍数 while (scanf("%d", &size)) { if (size == 0) { // 如果为零,则程序结束 break; } getchar();//吃掉回车 //每次读取数据都把最终图样二维数组初始化为 0 for (int i = 0; i < 3007; i++) { for (int j = 0; j < 3007; j++) { outlook[i][j] = { 0 }; } } // 读取原始样板图 for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { sample[i][j] = getchar(); } getchar(); } scanf("%d", &duplic); //数据读取结束 //开始分层绘制最终图样 //计算最终图样边长大小 int edge = edgeCompute(size, duplic); //初始化最终图样的(第一层)底层图为空格 ' ' for (int i = 0; i < edge; ++i) { for (int j = 0; j < edge; ++j) { outlook[i][j] = ' '; } } //在最终图样的全部是空格 ' ' 的图的基础上从细节处一个个递归的绘制最终图 paint(size, duplic, 0, 0); for (int i = 0; i < edge; ++i) { printf("%s\n", outlook[i]); } //printf("%d, %d", duplic, edge);//调试函数是否正确 } return 0; }