重复者
给定一个仅包含一种字符和空格的模板,将之不断重复扩大。
例如,模板如下所示
# #
#
# #
那么,第 1 级的图形为
# #
#
# #
第 2 级的图形为
# # # #
# #
# # # #
# #
#
# #
# # # #
# #
# # # #
模板中包含多少元素,那么任意级别的图形中就包含多少元素。
模板或 1 级图形中的元素为单个字符,而高等级的图形中的元素为低一级别的图形。
现在给定模板,请你输出该模板的第 Q
级图形的具体图案。
输入格式
输入包含多组测试数据。
每组数据第一行包含整数 N,表示模板的尺寸大小为 N×N。
接下来 N 行,每行包含 N 个字符,用来描述模板。
最后一行,包含一个整数 Q,表示所求的图形等级。
当输入 N=0 时,表示输入结束。
经典递归解法
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n;
vector<string> p;
vector<string> g(int k)
{
if( k == 1 )return p;
auto s = g(k - 1);
int m = s.size();
vector<string> res(n * m);
for(int i = 0; i < n * m; i++)
res[i] = string(n * m, ' ');
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
if(p[i][j] != ' ')
for(int x = 0; x < m; x++)
for(int y = 0; y < m; y++)
res[i * m + x][j * m + y] = s[x][y];
return res;
}
int main()
{
while( cin >> n, n )
{
p.clear();
getchar();
for(int i = 0; i < n; i++)
{
string s;
getline(cin, s);
p.push_back(s);
}
int k;
cin >> k;
auto res = g(k);
for(auto s: res)cout << s << endl;
}
return 0;
}
评论区