//土尔逊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;
}