当前位置: 首页 > news >正文

小杨的H字矩阵-洛谷B3924 [GESP202312 二级]

题目描述

小杨想要构造一个 N×N 的 H 字矩阵(N 为奇数),具体来说,这个矩阵共有 N 行,每行 N 个字符,其中最左列、最右列都是 | ,而中间一行(即第 (N+1)/2 行)的第 2∼N−1 个字符都是 - ,其余所有字符都是半角小写字母 a。例如,一个 N=5 的 H 字矩阵如下:

请你帮小杨根据给定的 N 打印出对应的“H 字矩阵”。

输入格式

一行一个整数 N(5≤N≤49 ,保证 N 为奇数)。

输出格式

输出对应的“H 字矩阵”。

请严格按格式要求输出,不要擅自添加任何空格、标点、空行等任何符号。你应该恰好输出 N 行,每行除了换行符外恰好包含 N 个字符,这些字符要么是 - ,要么是 | ,要么是 a 。你的输出必须和标准答案完全一致才能得分,请在提交前仔细检查。

输入输出样例

B3924 [GESP202312 二级] 小杨的H字矩阵 - 洛谷  https://www.luogu.com.cn/problem/B3924

解题思路

参考小杨的 X 字矩阵(举一反三)

我前一篇文章曾用行列号关系解决X矩阵,那么H矩阵是否也能用类似方法呢?哪些条件需要调整?

特征            X 字矩阵                      H 字矩阵
图形结构    两条对角线交叉            两竖线 + 一条水平线
核心规律    i == j 或 i + j == N+1       j == 0 或 j == N 或 i == 中心行(N+1)/2
符号分配    对角线+,其余-            边界|   ,中间行-,其余a

同X矩形不同的是,此题用到了三种字符输出 ,所以需要考虑三种情况,所以用到了if...else if...else结构。

数学建模(条件分解)

目标:将规律转化为逻辑条件,强调 分层判断

  1. 边界列j == 1 || j == N → '|'

  2. 中心行i == (N+1)/2 且 j > 1 && j < N→ '-'

  3. 默认填充:其余情况 → 'a'

公式化表示

if (j == 1 || j == N) 

      cout << '|'; 

else if (i == (N+1) / 2)  

      cout << '-';

else  cout << 'a'; 

代码实现

#include <iostream>
using namespace std;
int main(){int N;cin>>N;for(int i=1;i<=N;i++){for(int j=1;j<=N;j++){if(j==1||j==N) cout<<'|';else if(i==(N+1)/2) cout<<'-';elsecout<<'a';}cout<<endl;}return 0;
}
  • 条件优先级先检查列边界,再处理中心行,最后默认情况。

举一反三(扩展思考)

变形问题:尝试其他字母矩阵:

1. T 字矩阵:

第一行全 -,中间列全 |,其余 a。

          if(i==1) cout<<'-';
          else if(j==(1+N)/2) cout<<'|';
          else cout<<'a';

2. 十字矩阵:

中心行和中心列为 +,其余 a(结合X和H的思路)。

          if(i==(1+N)/2||j==(1+N)/2) cout<<'+';
          else cout<<'a';

3. 日字矩阵

            if(j==1||j==N)     cout<<'|';
            else if(i==1||i==N||i==(1+N)/2)    cout<<'-';
            else    cout<<'x';

方法论总结

  • 观察图形分层(边界、中心行/列、填充区)。
  • 用行列号建立条件(类似坐标轴思维)。
  • 按优先级编写判断逻辑(边界优先,特殊区域次之)。

与X矩阵的对比总结

维度           X 字矩阵                                           H 字矩阵
核心条件    对角线关系(i±j)                            列边界 + 中心行固定值
符号逻辑    两条线交叉                                       三部分独立判断
思维扩展    适用于斜线类图形(如Z、菱形)    适用于横纵线组合(如T、工字形)

通过这种对比,能更深刻理解 “行列号定位法” 的通用性,并灵活迁移到其他矩阵问题中。

http://www.dtcms.com/a/335332.html

相关文章:

  • Python环境下载安装、以及环境配置教程(Windows版)
  • Vue组件基础解析
  • B+树索引分析:单表最大存储记录数
  • AI搜索:大模型商业落地的“第一束光”,照见了什么?
  • 车灯的技术和未来方向
  • Python列表与元组:数据存储的艺术
  • 【科研绘图系列】R语言在DOM再矿化数据分析与可视化中的应用
  • 力扣(接雨水)——基于最高柱分割的双指针
  • LLaVA
  • 胶质母细胞瘤对化疗的敏感性由磷脂酰肌醇3-激酶β选择性调控
  • MySQL 的 DDL / DML / DQL / DCL 做一次系统梳理:概念区别→常用语法→特点与注意点→实战小例子→常见面试/坑点速记
  • 解构下一-代 AI 智能体:超越 LLM,深度解析三大核心支柱——上下文、认知与行动
  • 基础数据结构
  • Linux——进程管理和计划任务管理
  • Python中*args和**kwargs
  • 基于springboot的在线视频教育管理系统设计与实现(源码+文档+部署讲解)
  • Flow-GRPO:通过在线 RL 训练 Flow matching 模型
  • 概率论基础教程第3章条件概率与独立性(二)
  • 如何解决C盘存储空间被占的问题,请看本文
  • C语言零基础第18讲:自定义类型—结构体
  • 9.从零开始写LINUX内核——设置中断描述符表
  • duiLib 实现鼠标拖动标题栏时,窗口跟着拖动
  • 深入了解 swap:作用、局限与分区建立
  • Linux sar命令详细使用指南
  • Effective C++ 条款45:运用成员函数模板接受所有兼容类型
  • Day2--滑动窗口与双指针--2090. 半径为 k 的子数组平均值,2379. 得到 K 个黑块的最少涂色次数,2841. 几乎唯一子数组的最大和
  • Linux软件编程:线程间通信
  • 【FreeRTOS】队列集
  • MySQL 插入数据提示字段超出范围?一招解决 DECIMAL 类型踩坑
  • 第三十七天(js前端数据加密和混淆)