1. 程式人生 > >HNUCM1366: 綠地裝飾解題報告---基本演算法(模擬)

HNUCM1366: 綠地裝飾解題報告---基本演算法(模擬)

                                         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;
}