3441. 重复者
给定一个仅包含一种字符和空格的模板,将之不断重复扩大。
例如,模板如下所示
# #
#
# #
那么,第 1 级的图形为
# #
#
# #
第 2 级的图形为
# # # #
# #
# # # #
# #
#
# #
# # # #
# #
# # # #
模板中包含多少元素,那么任意级别的图形中就包含多少元素。
模板或 1 级图形中的元素为单个字符,而高等级的图形中的元素为低一级别的图形。
现在给定模板,请你输出该模板的第 Q 级图形的具体图案。
输入格式
输入包含多组测试数据。
每组数据第一行包含整数 N,表示模板的尺寸大小为 N×N。
接下来 N 行,每行包含 N 个字符,用来描述模板。
最后一行,包含一个整数 Q,表示所求的图形等级。
当输入 N=0 时,表示输入结束。
输出格式
每组数据输出一个所求的具体图案。
数据范围
3≤N≤5,
输出图案保证尺寸不超过 3000×3000,
每个输入最多包含 10 组数据。
输入样例:
3
# #
#
# #
1
3
# #
#
# #
3
4
OO
O O
O O
OO
2
0
输出样例:
# #
#
# #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# #
# # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# #
# # # #
# #
#
# #
# # # #
# #
# # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# #
# # # #
# # # # # # # #
# # # #
# # # # # # # #
OO OO
O OO O
O OO O
OO OO
OO OO
O O O O
O O O O
OO OO
OO OO
O O O O
O O O O
OO OO
OO OO
O OO O
O OO O
OO OO
C语言版代码如下:
#include<stdio.h>
#include<math.h>
char pattern[3000][3000];//模板图像
char last[3000][3000];//上一级图像
char changed[3000][3000];//最终图像
int curLength;
void change(int rank) {
if (rank == 1) {
for (int i = 0; i < curLength; i++)
for (int u = 0; u < curLength; u++)
last[i][u] = pattern[i][u];
return;
}
change(rank - 1);
int s = pow(curLength,rank-1);
for (int i = 0; i < curLength; i++)
for (int u = 0; u < curLength; u++) {
if (pattern[i][u] != ' ')
for (int x = 0; x < s; x++)
for (int y = 0; y < s; y++) {
int a = x + i * s, b = y + u * s;
changed[a][b] = last[x][y];
}
else {
for (int x = 0; x < s; x++)
for (int y = 0; y < s; y++) {
int a = x + i * s, b = y + u * s;
changed[a][b] = ' ';
}
}
}
for (int i = 0; i < s * (curLength); i++)
for (int u = 0; u < s * (curLength); u++)
last[i][u] = changed[i][u];
return;
}
int main() {
int N;
while (1) {
scanf_s("%d", &N);
getchar(); //吃掉换行符
if (N == 0)
break;
for (int i = 0; i < N; ++i) {
fgets(pattern[i], 3000, stdin);
curLength = strlen(pattern[i])-1;// _#\n --> 3
for (int j = curLength; j < N; j++) {
pattern[i][j] = ' ';
}
}
int rank;
scanf_s("%d", &rank);
change(rank);
if (rank != 1) {
int a = pow(curLength, rank);
for (int i = 0; i < a; i++) {
changed[i][a] = '\0';
printf("%s\n", changed[i]);
}
}
else {
for (int i = 0; i < curLength; i++)
printf("%s", pattern[i]);
}
}
return 0;
}
首先读入模板和等级,然后定义辅助函数进行递归计算。最后根据等级的不同输出结果。
模板的大小为n×n,等级为Q,则递归的深度为Q,每一层递归的时间复杂度为O(n^2),因此总时间复杂度为O(Q × n^2)。