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判断输出字符

🎁 记忆口诀

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


🌟 这道题真正的考点

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

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


相关推荐
☆cwlulu2 小时前
try-throw-catch异常捕获流程
开发语言·c++
王老师青少年编程2 小时前
2026年6月GESP真题及题解(C++五级):排排坐
c++·题解·真题·gesp·五级·2026年6月·排排坐
郝学胜-神的一滴3 小时前
Qt 高级编程 034:深耕QWidget底层内核—彻底吃透无边框窗口设计核心原理
开发语言·c++·qt·程序人生·软件开发·用户界面
不会写代码的ys3 小时前
C++复习篇
java·开发语言·c++
aichitang20243 小时前
数论变换(NTT)
c++·算法·fft·ntt
_olone3 小时前
AtCoder Beginner Contest 465 D - X to Y
c++·算法
星夜夏空994 小时前
C++学习(3) —— C++输入输出流
c++·学习
CAU界编程小白4 小时前
CAU抢课脚本
c++·脚本
MOONICK4 小时前
windows原生条件变量支持
c++·windows