题目带有递归性质,但递归效率低,改为迭代实现。
新方法,两个缓冲区轮换使用的方法,详见代码
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
char temp[3001][3001];
char res1[3001][3001];
char res2[3001][3001];
void tempcopy(char source[3001][3001], char target[3001][3001], /*target的首坐标*/int r, int c, int n)
{
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
target[r+i][c+j] = source[i][j];
}
}
}
//模板,长度,上一层模板,长度,结果,特殊字符,层数
void nextLevel(char temp[3001][3001], int n, char module[3001][3001], char res[3001][3001], char c, int l)
{
//清空RES
int mmax = pow((double)n, (double)l);
int i,j;
for (i=0; i<mmax; i++)
{
for (j=0; j<mmax; j++)
{
res[i][j] = ' ';
}
}
int bias = pow((double)n, (double)l-1);
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
if (temp[i][j] == c)
{
tempcopy(module, res, i*bias, j*bias, bias);
}
}
}
int max = l*n;
for (i=0; i<max; i++)
{
for (i=0; i<max; i++)
{
if (res[i][j] != c)
{
res[i][j] = ' ';
}
}
}
}
int main()
{
int n, q, i, j;
while(cin >> n && n!=0)
{
for (i=0; i<7; i++)
{
for (j=0; j<7; j++)
{
temp[i][j] = ' ';
}
}
char c=' ';
cin.get();
for (i=0; i<n; i++)
{
cin.getline(temp[i],n+1);
}
cin >> q;
int max = pow((double)n,(double)q);
//清空
for (i=0; i<max; i++)
{
for (j=0; j<max; j++)
{
res1[i][j] = ' ';
res2[i][j] = ' ';
}
}
//复制temp用于第一次扩展去特殊化
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
res1[i][j] = temp[i][j];
}
}
//确定tmp中的特殊字符
for (i=0; i<n; i++)
{
if (temp[0][i] != ' ')
{
c = temp[0][i];
break;
}
}
//扩展
for (i=2; i<=q; i++)
{
if (i%2 != 0)//奇次
{
nextLevel(temp, n, res2, res1, c, i);
}
else//偶次
{
nextLevel(temp, n, res1, res2, c, i);
}
}
if (i%2 != 0)
{
for (i=0; i<max; i++)
{
for (j=0; j<max; j++)
{
printf("%c", res2[i][j]);
}
printf("
");
}
}
else
{
for (i=0; i<max; i++)
{
for (j=0; j<max; j++)
{
printf("%c", res1[i][j]);
}
printf("
");
}
}
}
return 0;
}