HNUCM1366: 綠地裝飾解題報告---基本演算法(模擬)
阿新 • • 發佈:2018-12-06
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; }