重复者

给定一个仅包含一种字符和空格的模板,将之不断重复扩大。

例如,模板如下所示

# #
 # 
# #

那么,第 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;
}