第三十七天:2025 图形绘制

2025 图形绘制

一、问题

小蓝面临的挑战是绘制一个 (h×w) 的矩形图形。其中,(h) 决定了图形的高度,(w) 则掌控着图形的宽度。以 (h = 5),(w = 10) 为例,这个图形呈现出如下模样:

复制代码
2025202520
0252025202
2520252025
5202520252
2025202520

仔细观察,我们便能发现其中的规律:第一行如同整齐排列的士兵,用 "2025" 重复填充。而从第二行起,仿佛是一场有序的位移,每行都向左移动一个字符,随后再以 "2025" 继续填充。这种规律既简单又蕴含着一种独特的美感,它激发着我们用代码将其完美呈现。

二、解题思路

  1. 输入部分:与用户的友好互动

    程序首先需要倾听用户的需求,获取图形的高度 (h) 和宽度 (w)。在 C++ 的世界里,标准输入流 cin 就像是一位贴心的信使,轻松实现了这一沟通。通过它,我们能够准确地捕捉到用户输入的信息,为后续的图形绘制奠定基础。

  2. 绘制图形部分:用循环编织图形的画卷

    为了绘制出这个图形,我们巧妙地运用嵌套的 for 循环。外层循环犹如一位指挥官,掌控着图形的行数,确保每一行都能有条不紊地绘制出来。而内层循环则像是一位勤劳的工匠,专注于每行的列数,精心雕琢每一个字符的位置。

对于每一行,我们巧妙地借助行号来确定从 "2025" 这个模式字符串的哪个字符开启输出之旅,以此实现每行向左移动一个字符的神奇效果。同时,通过对模式字符串长度取模的方式,如同给程序装上了一个精准的导航仪,无论索引如何增长,都能确保在模式字符串的有效范围内循环使用字符,从而完美地填充整行。

三、C++ 代码实现

cpp 复制代码
#include <iostream>
#include <string>

int main() {
    int h, w;
    std::cin >> h >> w;
    std::string pattern = "2025";
    for (int i = 0; i < h; ++i) {
        int index = i;
        for (int j = 0; j < w; ++j) {
            std::cout << pattern[index % 4];
            index++;
        }
        std::cout << std::endl;
    }
    return 0;
}

四、代码解读

  1. 变量定义与输入:信息的初始化与获取

    • int h, w; 这简单的一行,定义了两个至关重要的整数变量 hw,它们如同两把钥匙,分别掌管着图形的高度和宽度。
    • std::cin >> h >> w; 借助 cin,程序能够与用户进行无缝对接,精准地获取到用户心中所想的图形尺寸。这一步是整个程序与外界交互的起点,它使得程序不再是孤立的存在,而是能够根据用户的需求灵活变化。
  2. 模式字符串与外层循环:构建图形的框架

    • std::string pattern = "2025"; 这里定义的 pattern 字符串,就像是图形绘制的蓝图,它明确了我们要重复使用的基本模式。
    • 外层 for 循环 for (int i = 0; i < h; ++i) 则像是一个节拍器,以 i0 开始,每次递增 1 的节奏,控制着图形逐行绘制。当 i 最终达到 h 时,整个图形的框架便已初步搭建完成。
  3. 内层循环与字符输出:细节之处见真章

    • int index = i; 在每行绘制的起始点,我们将索引变量 index 初始化为当前行号 i。这个小小的举动意义非凡,它为每行字符的输出设定了独特的起始位置,是实现每行向左移动一个字符效果的关键所在。
    • 内层 for 循环 for (int j = 0; j < w; ++j) 则专注于每行的列数控制。随着 j0 逐步递增到 w,每行所需的字符数量得以保证。
    • std::cout << pattern[index % 4]; 在每次内层循环中,程序会输出模式字符串 pattern 中索引为 index % 4 的字符。这一操作巧妙地利用了取模运算,无论 index 如何变化,都能确保输出的字符始终在模式字符串 "2025" 的范围内,实现了字符的循环使用。
    • index++; 每次输出字符后,index 自增 1,这使得下一次循环能够输出模式字符串中的下一个字符,如同接力赛一般,有序地完成每行字符的绘制。
  4. 换行操作:塑造图形的完美形态

    • std::cout << std::endl; 当内层循环结束,也就是一行的所有字符绘制完毕后,这一简单的语句便发挥了关键作用。它输出一个换行符,如同给图形绘制工作按下了换行键,使得下一行的字符能够在新的一行开始绘制,从而塑造出矩形的完美形态。

五、拓展

  1. 调整模式字符串:尝试将模式字符串从"2025"改为"1357"或"ABCD"等不同组合,观察图形产生的变化。这种调整不仅能满足多样化的视觉需求,更有助于深入理解模式与图形之间的关联规律。

  2. 实现动态模式:改用程序动态生成模式字符串,替代固定的"2025"。可以根据用户输入或特定算法实时生成模式,从而创造出更加丰富多变的图形效果,显著提升程序的灵活性和趣味性。

  3. 应用图形变换:完成基础图形绘制后,可进行多种变形处理。例如旋转90度、180度,或执行对称操作等,通过这些变换可以衍生出全新的图形样式。这一过程既能提升编程技能,又能有效培养空间想象力和创新思维。

相关推荐
weixin_429630262 小时前
机器学习-第三章 线性模型
人工智能·算法·机器学习
补三补四4 小时前
图卷积网络 (GCN)
网络·人工智能·深度学习·神经网络·算法·机器学习
未知陨落4 小时前
LeetCode:82.杨辉三角
算法·leetcode
CoovallyAIHub4 小时前
全球首个精细梯田地块数据集GTPBD发布:为梯田遥感研究填补空白(附数据地址)
深度学习·算法·计算机视觉
CoovallyAIHub4 小时前
【一周AI风暴】周鸿祎放话“不用AI就裁员”,前谷歌CEO鼓吹对华996血拼!
深度学习·算法·计算机视觉
Miraitowa_cheems5 小时前
LeetCode算法日记 - Day 55: 子集、找出所有子集的异或总和再求和
数据结构·算法·leetcode·决策树·深度优先·剪枝
熬了夜的程序员5 小时前
【LeetCode】48. 旋转图像
算法·leetcode·链表·职场和发展·深度优先
Q741_1475 小时前
C++ 位运算 高频面试考点 力扣 268. 丢失的数字 题解 每日一题
c++·算法·leetcode·面试·位运算
未知陨落5 小时前
LeetCode:79.跳跃游戏Ⅱ
算法·leetcode