acwing3441重复者

文章介绍了如何使用C语言通过递归算法生成一个只包含一种字符和空格的模板在不同等级的图形。算法的时间复杂度与图形等级和模板尺寸有关。
摘要由CSDN通过智能技术生成

3441. 重复者

给定一个仅包含一种字符和空格的模板,将之不断重复扩大。

例如,模板如下所示

# #
 # 
# #

那么,第 1 级的图形为

# #
 # 
# #

第 2 级的图形为

# #   # #
 #     # 
# #   # #
   # #   
    #    
   # #   
# #   # #
 #     # 
# #   # #

模板中包含多少元素,那么任意级别的图形中就包含多少元素。

模板或 1 级图形中的元素为单个字符,而高等级的图形中的元素为低一级别的图形。

现在给定模板,请你输出该模板的第 Q 级图形的具体图案。

输入格式

输入包含多组测试数据。

每组数据第一行包含整数 N,表示模板的尺寸大小为 N×N。

接下来 N 行,每行包含 N 个字符,用来描述模板。

最后一行,包含一个整数 Q,表示所求的图形等级。

当输入 N=0 时,表示输入结束。

输出格式

每组数据输出一个所求的具体图案。

数据范围

3≤N≤5,
输出图案保证尺寸不超过 3000×3000,
每个输入最多包含 10 组数据。

输入样例:
3
# #
 # 
# #
1
3
# #
 # 
# #
3
4
 OO 
O  O
O  O
 OO 
2
0
输出样例:
# #
 # 
# #
# #   # #         # #   # #
 #     #           #     # 
# #   # #         # #   # #
   # #               # #   
    #                 #    
   # #               # #   
# #   # #         # #   # #
 #     #           #     # 
# #   # #         # #   # #
         # #   # #         
          #     #          
         # #   # #         
            # #            
             #             
            # #            
         # #   # #         
          #     #          
         # #   # #         
# #   # #         # #   # #
 #     #           #     # 
# #   # #         # #   # #
   # #               # #   
    #                 #    
   # #               # #   
# #   # #         # #   # #
 #     #           #     # 
# #   # #         # #   # #
     OO  OO     
    O  OO  O    
    O  OO  O    
     OO  OO     
 OO          OO 
O  O        O  O
O  O        O  O
 OO          OO 
 OO          OO 
O  O        O  O
O  O        O  O
 OO          OO 
     OO  OO     
    O  OO  O    
    O  OO  O    
     OO  OO     

C语言版代码如下:

#include<stdio.h>
#include<math.h>
char pattern[3000][3000];//模板图像
char last[3000][3000];//上一级图像
char changed[3000][3000];//最终图像
int curLength;
void change(int rank) {
    if (rank == 1) {
        for (int i = 0; i < curLength; i++)
            for (int u = 0; u < curLength; u++)
                last[i][u] = pattern[i][u];
        return;
    }
    change(rank - 1);
    int s = pow(curLength,rank-1);
    for (int i = 0; i < curLength; i++)
        for (int u = 0; u < curLength; u++) {
            if (pattern[i][u] != ' ')
                for (int x = 0; x < s; x++)
                    for (int y = 0; y < s; y++) {
                        int a = x + i * s, b = y + u * s;
                        changed[a][b] = last[x][y];
                    }
            else {
                for (int x = 0; x < s; x++)
                    for (int y = 0; y < s; y++) {
                        int a = x + i * s, b = y + u * s;
                        changed[a][b] = ' ';
                    }
            }
        }
    for (int i = 0; i < s * (curLength); i++)
        for (int u = 0; u < s * (curLength); u++)
            last[i][u] = changed[i][u];
    return;
}
int main() {
    int N;
    while (1) {
        scanf_s("%d", &N);
        getchar();               //吃掉换行符
        if (N == 0)
            break;
        for (int i = 0; i < N; ++i) {
            fgets(pattern[i], 3000, stdin);
            curLength = strlen(pattern[i])-1;// _#\n --> 3
            for (int j = curLength; j < N; j++) {
                pattern[i][j] = ' ';
            }
        }
        int rank;
        scanf_s("%d", &rank);
        change(rank);
        if (rank != 1) {
            int a = pow(curLength, rank);
            for (int i = 0; i < a; i++) {
                changed[i][a] = '\0';
                printf("%s\n", changed[i]);
            }

        }
        else {
            for (int i = 0; i < curLength; i++)
                printf("%s", pattern[i]);
        }
    }
    return 0;
}

        首先读入模板和等级,然后定义辅助函数进行递归计算。最后根据等级的不同输出结果。

        模板的大小为n×n,等级为Q,则递归的深度为Q,每一层递归的时间复杂度为O(n^2),因此总时间复杂度为O(Q × n^2)。 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值