GESP2026年6月认证C++二级( 第三部分编程题(2、菱形))精讲


第三部分 编程题第二题

《钻石王国里的神奇菱形》


第一幕:钻石王国

1、很久很久以前。

程序王国举行了一场比赛。

国王说:

"今天,我们不用画笔。"
"只允许用两个字符。"

复制代码
+
.

要求画出一颗漂亮的钻石(菱形)。


2、例如:

复制代码
..+..
.+.+.
+...+
.+.+.
..+..

画的是不是很规则?


第二幕:先观察规律

假设:

复制代码
n = 3

1、画布有多大?

很多同学第一反应:

"3×3?"

其实不是!


2、题目要求:

复制代码
2*n-1

所以:

复制代码
2×3-1=5

画布大小:

复制代码
5 × 5

3、我们给画布加上坐标。

复制代码
    1 2 3 4 5
1   . . + . .
2   . + . + .
3   + . . . +
4   . + . + .
5   . . + . .

第三幕:寻找四位守卫

1、汉克老师说:

"先找那些 +。"


第一颗:

复制代码
(1,3)

第二颗:

复制代码
(2,2)

第三颗:

复制代码
(2,4)

第四颗:

复制代码
(3,1)

第五颗:

复制代码
(3,5)

......


2、你忽然会发现:

+号组成了四条边。


第四幕:第一条边

1、看看:

复制代码
(1,3)

(2,2)

(3,1)

2、汉克老师让大家算:

复制代码
1+3=4

2+2=4

3+1=4

哇!

全部都是:

复制代码
4

3、而:

复制代码
n=3

所以:

复制代码
n+1 = 4

4、我们找到一个规律:

第一条边的条件是:

复制代码
i+j==n+1

第五幕:第二条边

1、接下来:

复制代码
(1,3)

(2,4)

(3,5)

2、我们继续算:

复制代码
3-1=2

4-2=2

5-3=2

3、我们又找到一个规律:

复制代码
j-i==n-1

第六幕:继续看第三条边

1、接下来:

复制代码
(3,5)

(4,4)

(5,3)

计算:

复制代码
3+5=8

4+4=8

5+3=8

都是:

复制代码
8

2、我们又找到一个规律:

复制代码
3*n-1 = 8

所以:

第三条的条件为:

复制代码
i+j==3*n-1

第七幕:第四条边

1、再看看:

复制代码
(3,1)

(4,2)

(5,3)

2、计算:

复制代码
3-1=2

4-2=2

5-3=2

全部一样!


2、而:

复制代码
n-1 = 2

于是:

第三条边的条件为:

复制代码
i-j==n-1

第八幕:四位守卫集合

1、于是:

一个点什么时候画:

复制代码
+

2、答案:

(1)只要属于四条边中的任何一条。

复制代码
if(
    i+j==n+1
    ||
    i+j==3*n-1
    ||
    i-j==n-1
    ||
    j-i==n-1
)

画:

复制代码
+

(2)否则就是:

复制代码
.

是不是突然特别简单?


第九幕:我们需要双重循环

1、画布:

复制代码
□□□□□
□□□□□
□□□□□
□□□□□
□□□□□

电脑必须一个格子一个格子画。


2、所以:

(1)外层:

复制代码
for(i)

负责:

一行一行。


(2)内层:

复制代码
for(j)

负责:

这一行每一列。

就像打印机一样。


第十幕:参考代码

复制代码
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;

    // 一共有 2*n-1 行
    for (int i = 1; i <= 2 * n - 1; i++)
    {
        // 每行也有 2*n-1 列
        for (int j = 1; j <= 2 * n - 1; j++)
        {
            // 在菱形四条边上
            if (i + j == n + 1 ||
                i + j == 3 * n - 1 ||
                i - j == n - 1 ||
                j - i == n - 1)
            {
                cout << '+';
            }
            else
            {
                cout << '.';
            }
        }

        cout << endl;
    }

    return 0;
}

第十一幕:我们要学会的思想

汉克老师希望大家不要只记住:

复制代码
i+j==...

真正应该学会的是:


第一步

先建立坐标。

复制代码
(1,1)

(1,2)

(1,3)
......

第二步

找规律。

不要急着写代码。

先看看:

哪些数字一直不变?

例如:

复制代码
i+j

是不是一样?

或者:

复制代码
i-j

是不是一样?


第三步

把规律变成条件。

例如:

复制代码
i+j==4

就写成:

复制代码
if(i+j==4)

程序就会自动画出来。


🌳 本题知识树

复制代码
字符图形
    │
    ├── 双重for遍历画布
    │
    ├── 建立坐标(i,j)
    │
    ├── 找规律
    │     │
    │     ├── i+j不变
    │     └── i-j不变
    │
    ├── 四条边
    │
    └── if判断输出字符

🎁 记忆口诀

画图先画坐标盘,
双层循环慢慢看。
加法减法找规律,
四条边界最关键。
找到不变写条件,
字符图形不再难!


🌟 这道题真正的考点

这道题看似是在画菱形,其实真正考查的是 二维坐标 + 双重循环 + 数学规律观察。

这道题有很多种解法,本讲解是以官方参考程序,对照讲解的。


相关推荐
FlightYe12 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
by2099913 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
Rover Ramble14 小时前
C++ 用互斥锁实现读写锁
开发语言·c++
你怎么知道我是队长14 小时前
C++零基础入门第2周:数据类型、运算符与表达式完全指南(附20段可运行代码+避坑清单)
c++
say_fall14 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
雪落漂泊15 小时前
C++算法 滑动窗口篇(下)
开发语言·c++
你怎么知道我是队长17 小时前
C++零基础第3周:if/else、switch、for/while/do-while 控制流完全指南(附20段可运行代码+避坑清单)
java·开发语言·c++
青少儿编程课堂18 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析
c++·python·算法·bfs·信息学竞赛
雷✘19 小时前
C++ 类与对象的初始化机制、成员访问边界与拷贝优化
java·网络·c++
努力实干19 小时前
简单工厂模式(Simple Factory Pattern)——C++
开发语言·c++·简单工厂模式