计算机复试之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;
        }
    }
}

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

### 如何在Qt Quick中使用RepeaterC++进行交互 为了实现`Qt Quick Repeater`组件与C++之间的集成,通常采用的方法是通过创建自定义的QML上下文属性来传递数据。这可以通过`QQmlContext::setContextProperty()`函数完成[^1]。 下面是一个具体的例子展示如何设置并利用这个机制: #### 定义C++类 首先,在C++端定义一个可以被QML访问的数据模型类。该类应该继承于`QObject`以便能够注册到QML环境中,并提供必要的信号和槽用于通信。 ```cpp // MyModel.h #ifndef MYMODEL_H #define MYMODEL_H #include <QObject> #include <QStringList> class MyModel : public QObject { Q_OBJECT public: explicit MyModel(QObject *parent = nullptr); QStringList items() const; signals: void dataChanged(); private slots: void updateData(); }; #endif // MYMODEL_H ``` 接着实现实现文件中的逻辑,这里简单地模拟了一些动态更新列表项的行为: ```cpp // MyModel.cpp MyModel::MyModel(QObject* parent): QObject(parent){ } QStringList MyModel::items() const{ static QStringList list{"Item 1", "Item 2"}; return list; } void MyModel::updateData(){ emit dataChanged(); // Notify changes to the view. } ``` #### 注册至QML环境并与Repeater关联 之后,在应用程序初始化阶段将上述对象实例化并通过`setContextProperty()`方法将其暴露给QML层。 ```cpp int main(int argc, char *argv[]) { QApplication app(argc, argv); QQmlApplicationEngine engine; MyModel model; // Create an instance of our custom class. QQmlContext *ctxt = engine.rootContext(); ctxt->setContextProperty("myModel", &model); // Expose it under name 'myModel'. engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); } ``` 最后一步是在QML侧编写UI代码,其中包含了`Repeater`控件用来遍历来自C++的对象所提供的条目集合。 ```qml import QtQuick 2.0 Rectangle { width: 360; height: 360 ListView { // Use a ListView instead of Column for better performance when scrolling large lists. anchors.fill: parent model: myModel.items // Bind repeater's model property to C++ object’s method returning item collection. delegate: Text { text: modelData // Each element from the array will populate this field automatically by index. font.pixelSize: 24 padding: 8 } } } ``` 这样就完成了基本的功能——每当调用`dataChanged()`信号时,视图会自动刷新显示最新的项目列表内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值