详细思路:

https://blog.csdn.net/LOG_IN_ME/article/details/122645786?spm=1001.2014.3001.5502

递归,关键是每层递归记住并计算当前层的元素坐标,递归终止时便结算该元素的最终位置。

#include<bits/stdc++.h>
using namespace std;

//递归
void recur(int s, int row, int col, int is, int N, char** u, char** &res, char d){
  	//s规模等级(逐层递减) row col当前元素坐标 is是否是非空字符 N基础模板边长 u基础模板矩阵 res结果矩阵 d非空字符
    //终止条件
    if(s == 0){
        if(is == 1){//此处为非空字符
            res[row][col] = d;
        }else{//此处为空格
            res[row][col] = ' ';
        }
        return ;
    }
    
    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++){
            if(u[i][j] != ' ' && is == 1){//下一层还是非空字符
                recur(s-1, N*row+i, N*col+j, 1, N, u, res, d);
            }else{//下一层是空格
                recur(s-1, N*row+i, N*col+j, 0, N, u, res, d);
            }
        }
}

int main(){
    int N = 0;
    while(cin >> N){
        if(N == 0)break;
        cin.get();//把输入缓冲区中的\n剃掉
        
        char** unit = new char*[N];//储存基础图形
        for(int i = 0; i < N; i++)
            unit[i] = new char[N];
        char denote = ' ';//基本符号
        
        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                cin.get(unit[i][j]);
                if(denote == ' ' && unit[i][j] != ' '){
                    denote = unit[i][j];
                }
            }
            cin.get();//把输入缓冲区中的\n剃掉
        }
        
        int scale = 0;//规模
        cin >> scale;
        
        int cap = N;//结果矩阵边长
        for(int i = 1; i < scale; i++)
            cap *= N;
        
        char** res = new char*[cap];//结果矩阵
        for(int i = 0; i < cap; i++)
            res[i] = new char[cap];
        
        //递归
        recur(scale, 0, 0, 1, N, unit, res, denote);
        //输出
        for(int i = 0; i < cap; i++){
            for(int j = 0; j < cap; j++)
                cout << res[i][j];
            cout << endl;
        }
        
    }
    return 0;
}