版权声明:转载请注明出处:https://blog.csdn.net/qq1013459920 https://blog.csdn.net/qq1013459920/article/details/84641982
1366: 绿地装饰
时间限制: 1 内存限制: 128 MB
题目描述
湖南中医药大学坐落于中国历史文化名城长沙,是湖南省重点建设本科院校,是全国首批设立国家级重
点学科的高校,也是首批招收博士研究生、留学生及港澳台学生的中医药院校。学校现有 2 个校区,占
地面积 1393 亩,建筑面积 52 万平方米,主校区依岳麓南坡,临湘江西岸,环境幽雅,风光秀丽,是求
学成才的理想之地。
校园景观设计师小 W 的主要工作就是植被环境的设计维护,他有一个 N×N 的模板图,他创作景观的步
骤如下:
1、将当前的绿地分成 N×N 小块,再按照模板图添加装饰(黑色表示有装饰,白色表示没有);
2、对于每个白色(未被装饰)的地块,递归操作 1,应用模板图,即分成更小的 N×N 块,继续进行装
饰,而黑色(已装饰)的地块则不必操作。
下图是某次装饰过程的示意图。
现在你的任务是求出 K 次递归后的绿地状态。
输入
单组数据。
第一行两个数 N,K,如题意中的描述。
接下来是一个 N×N 的模板图,’ . ’ 表示白色,’ * ’ 表示黑色。
2 ≤ n ≤ 3
1 ≤ k ≤ 5
输出
输出一个 N K×N K 的矩阵表示答案,不允许有多余的空行或空格。
样例输入
2 3
.*
..
样例输出
.*******
..******
.*.*****
....****
.***.***
..**..**
.*.*.*.*
........
思路:
保存输入的模板后,用一个中间数组去更新每次的装饰过程(数据小,暴力模拟)
AC Code:
#include <cstdio>
#include <cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<map>
#include<queue>
#include<climits>
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
using namespace std;
static const int MAX_N = 2e5 + 5;
char form[5][5];
char maps[255][255];
char res[255][255];
int main(){
int n, q;
scanf("%d%d", &n, &q);
for(int i = 0; i < n; i++){
scanf("%s", form[i]);
}
res[0][0] = '.';
int N = 1;
while(q--){
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
if(res[i][j] == '.'){
for(int k = 0; k < n; k++){
for(int t = 0; t < n; t++){
maps[i * n + k][j * n + t] = form[k][t];
}
}
}
else {
for(int k = 0; k < n; k++){
for(int t = 0; t < n; t++){
maps[i * n + k][j * n + t] = '*';
}
}
}
}
}
N *= n;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
res[i][j] = maps[i][j];
}
}
}
for(int i = 0; i < N; i++){
printf("%s\n", res[i]);
}
return 0;
}