计算机复试之KY58 Repeater(c++)

本文介绍了一种基于模板的输出算法,通过逐步放大模板中的特定字符来生成更大的模式。该算法适用于需要按比例放大的图案输出场景,文中详细解释了算法的工作原理,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目在这里插入图片描述在这里插入图片描述

在这里插入图片描述
输入:

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     

思路分析

首先明确这是一道模板输出题目,即根据现有模板,进行加工输出。

  1. 如果我们找不到如何下手,首先可以利用excel进行手动模拟,如下所示:
    在这里插入图片描述

由题意知道,每次是将如33的规模中为#的位置替换为33的单元,那么就可以构造为99的规模,原理很简单。那么空格的位置又是如何确定呢?仔细观察可知,由于题目所给的图案都是刚好在一个正方体内,那么显然,一个空格直接替换为33的单元即可。如果不好理解,反过来思考,有#的位置都替换为33,如果空格位置不是替换为33的规模,那么就不是成比例扩大了。

  1. 在第一步的基础上,我们就易于用代码实现。(该题两种类型题解,此处提供不使用DFS的方案实现)

代码解析
#include<iostream>
#include<string>
#include<math.h>
char patern[300][300]{};
char _patern[300][300]{};
using namespace std;
int main()
{
    int size, scale, one;
    string str;
    while (cin >> size && size) {
        cin.get();   //吃掉回车
        for (int i = 0; i < size; ++i) {
            getline(cin, str);
            for (int j = 0; j < str.size(); ++j) {
                _patern[i][j] = str.at(j);   //最小的模板单元
                patern[i][j] = str.at(j);    //每次参照的模板
            }
        }
        //读入输出规模
        cin >> scale;
        one = size;
        for (int i = 2; i <= scale; ++i) {
            size = pow(one, i - 1);    //规模扩大
            char t_out[300][300]{};
            //对模板的每一个字符进行判断,以便进行扩大
            for (int _row = 0; _row < size; ++_row) {
                int pos_num = 0;
                for (int _col = 0; _col < size; ++_col) {
                    //填充空格,等比例填充空格数
                    if (patern[_row][_col] == ' ') {
                        for (int ii = 0; ii < one; ++ii) {
                            for (int jj = 0; jj < one; ++jj) {
                                t_out[_row * one + ii][pos_num * one + jj] = ' ';
                            }
                        }
                        pos_num++;
                    }
                    //填充字符
                    else {
                        for (int ii = 0; ii < one; ++ii) {
                            for (int jj = 0; jj < one; ++jj) {
                                t_out[_row * one + ii][pos_num * one + jj] = _patern[ii][jj];
                            }
                        }
                        pos_num++;
                    }
                }
            }
            //更新下一次参照的模板
            for (int ii = 0; ii < pow(one, i); ++ii) {
                for (int jj = 0; jj < pow(one, i); ++jj) {
                    patern[ii][jj] = t_out[ii][jj];
                }
            }
        }
        for (int ii = 0; ii < pow(one, scale); ++ii) {
            for (int jj = 0; jj < pow(one, scale); ++jj) {
                cout << patern[ii][jj];
            }
            cout << endl;
        }
    }
}

牛客网判断结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值