1.题目分析

输入:要求第一行为N,使基本图形为N*N(N只能是3,4,5),第二行为基本图形,第三行为重复的比例级别。

用一个二维数组来存储基本图形,之后遍历图形,level从0开始,遇到字符就用基本图形去填充结果,遇到空格就用len*len个空格(len与=n的level次方)去填充,循环一次更新结果,使结果作为新的模板,直到level达到输入的要求。

2.代码实现

#include <iostream>
#include <cmath>
#include<string>
using namespace std;

char pic[6][6];
char element[3000][3000];//重复的基本图形 
char res[3000][3000];//最终结果


void Space(char res[][3000], char element[][3000], char pic[][6], int len, int row, int col) {
    for (int i = row; i < row + len; i++) {
        for (int j = col; j < col + len; j++) {
            res[i][j] = ' ';
        }
    }
}

void Update(char res[][3000], char element[][3000], char pic[][6], int len, int row, int col) {
    for (int i = row; i < row + len; i++) {
        for (int j = col; j < col + len; j++) {
            res[i][j] = element[i - row][j - col];
        }
    }
}




int main() {
    int n, level, len;
    // printf("请输入N\n");
    while (cin >> n) {


        cin.get();//前面的在读取输入时会在缓冲区中留下一个字符'\n',
                //所以如果不在此加一个getchar()把这个回车符取走的话,getline()就不会等待从键盘键入字符,
                //而是会直接取走这个回车符,从而导致读取有误;

        //printf("请输入图形\n");
        for (int i = 0; i < n; i++) {
            cin.getline(pic[i], n + 1);
        }

       // printf("请输入level\n");
        cin >> level;

        for (int a = 0; a < level; a++) {
            len = pow(n, a);

            //边界条件
            if (len == 1) {
                for (int i = 0; i < n; i++) {
                    for (int j = 0; j < n; j++) {
                        element[i][j] = pic[i][j];
                        res[i][j] = element[i][j];
                    }
                }
            }

            //更新结果
            else {
                for (int i = 0; i < n; i++) {
                    for (int j = 0; j < n; j++) {
                        if (pic[i][j] != ' ') {
                            Update(res, element, pic, len, i * len, j * len);
                        }
                        else {
                            Space(res, element, pic, len, i * len, j * len);
                        }
                    }
                }
            }

            //更新模板
            for (int i = 0; i < n * len; i++) {
                for (int j = 0; j < n * len; j++) {
                    element[i][j] = res[i][j];
                }
            }
        }

        //输出结果
        for (int i = 0; i < n * len; i++) {
            for (int j = 0; j < n * len; j++) {
                cout << res[i][j];
            }
            cout << endl;
        }
    }
    return 0;
} 

3.要点记录

这题做了好久,更新模板和更新结果那里绕晕了,同时也要注意读入字符时缓冲区的状态,如果有一个换行符,要用getchar()先取走