HNUCM1366: 绿地装饰解题报告---基本算法(模拟)

版权声明:转载请注明出处: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;
}

猜你喜欢

转载自blog.csdn.net/qq1013459920/article/details/84641982