思路
1.将目标分为团案和空白,无论是图案还是空白尺寸都是正方形。用一个int数组blank装模板,1处打印图形,0处打印空白
正方形的尺寸与层数有n的level次方的关系
2.输入一个目标level,层数从1开始扩大,根据blank数组将上次的图案打印进二维数组,一轮结束后保存当前的图形作为下一层的模板
__
define _CRT_SECURE_NO_WARNINGS
include [HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
using namespace std;
char paint[3000][3000];//最终的绘制数组
int blank[3000][3000];//记录字符位置,1表示输出字符,0表示输出空格
char model[3000][3000];//模型数组,记录每过一层的模型
//逐层扩大
int ChongFuZhe(int n,int level) {//输入初始尺寸,输入目标层数,返回最后的尺寸
int N = n,k;//变换后的尺寸
int I = 0, J=0;//记录变化的行列指针
//转换为0 1 矩阵,1打印图形,0打印空白,大小为正方形面积
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (model[i][j] != ' ') {
blank[i][j] = 1;
}
else {
blank[i][j] = 0;
}
}
}
for (int i = 0; i < n; i++) {//model 赋值到paint
for (int j = 0; j < n; j++) {
paint[i][j] = model[i][j];
}
}
//逐层扩大图形
for (k = 1; k < level; k++) {//当blank=1时绘制一个模板
N = pow(n, k);//每层的边长为n的i次方
for (int i = 0,I=0; i < n; i++) {//遍历blank,看何时输出模板何时输出空白
for (int j = 0,J=0; j < n; j++) {
if (1 == blank[i][j]) {//看看绘制模板还是绘制空格
for (int z = 0; z < N; z++) {//绘制模板
for (int x = 0; x < N; x++) {
paint[z+I][x+J] = model[z][x];
}
}
}
else {//绘制白板
for (int z = 0; z < N; z++) {
for (int x = 0; x < N; x++) {
paint[z + I][x + J] = ' ';
}
}
}
J += N;
}
I += N;
}
for (int i = 0; i < pow(n,k+1); i++) {//model 赋值到paint
for (int j = 0; j < pow(n, k + 1); j++) {
model[i][j] = paint[i][j];
}
}
}
return k;
}
int main() {
int N = 3, level = 1;//模板大小,层级
while(scanf("%d",&N)!= EOF)
{
getchar();
memset(paint, 0, 9000000);
memset(blank, 0, 9000000);
memset(model, 0, 9000000);
if (0 == N) break;
for (int i = 0; i < N; i++) {//元素输入数组
// gets_s(model[i]);
fgets(model[i], sizeof(model), stdin);
}
scanf("%d", &level);
ChongFuZhe(N, level);
for (int i = 0; i < pow(N,level); i++) {//输出测试
for (int j = 0; j < pow(N, level); j++) {
printf("%c", paint[i][j]);
}
printf("\n");
}
}
return 0;
}