题目链接:HRBUST 2347
题面
Time Limit: 1000 MS Memory Limit: 256000 K
Description
递归图形是一类非常有意思的图形,今天介绍其中一种,点阵递归图(这个名字其实是随便起的)。点阵递归图有如下特点:
第一层若是:
第二层即为:
Input
输入数据有多组,第一行输入两个正整数a,b(ab<1000),表示边长为a的正方形第一层图形,b表示将要输出的b层图形,接下来是a行字符串,每行字符串包含a个字符,字符为空格或*。
Output
对于每组数据输出一个图形,每组输出后跟随一个空行。
Sample Input
Sample Output
Hint
输入输出为正方形图形,不是*的位置,保留空格占位。
Source
"华为杯"2017级程序设计竞赛
思路
若深度为1,就画最小的图形;若深度不为1,则根据最小图形的信息,深度-1,并且根据规律确定下一级深度的开始坐标,进行递归即可。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1007;
char Output[maxn][maxn];
char MinG[maxn][maxn];
int MinSize,Depth;
int Pow(int a,int b){
int ans = 1;
for(int i = 0 ; i < b ; i++)
ans*=a;
return ans;
}
void Copy(int x,int y){
for(int i = 0 ; i < MinSize ; i++)
for(int j = 0 ; j < MinSize ; j++)
Output[x+i][y+j] = MinG[i][j];
}
void run(int Depth,int x,int y){
if(Depth == 1){
Copy(x,y);
}else{
int OneStep = Pow(MinSize,Depth - 1);
for(int i = 0 ; i < MinSize ; i++)
for(int j = 0 ; j < MinSize ; j++)
if(MinG[i][j] == '*')
run(Depth - 1,x + OneStep * i,y + OneStep * j);
}
}
int main(void){
while(~scanf("%d%d",&MinSize,&Depth)){
getchar();
memset(Output,0,sizeof Output);
memset(MinG,0,sizeof MinG);
for(int i = 0 ; i < MinSize ; i++)
gets(MinG[i]);
run(Depth,0,0);
int Size = Pow(MinSize,Depth);
for(int i = 0 ; i < Size ; i++){
for(int j = 0 ; j < Size ; j++)
if(Output[i][j] == '*') putchar('*');
else putchar(' ');
puts("");
}
puts("");
}
return 0;
}