详细思路:
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;
}