




第三部分 编程题第二题
《钻石王国里的神奇菱形》
第一幕:钻石王国
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判断输出字符
🎁 记忆口诀
画图先画坐标盘,
双层循环慢慢看。
加法减法找规律,
四条边界最关键。
找到不变写条件,
字符图形不再难!
🌟 这道题真正的考点
这道题看似是在画菱形,其实真正考查的是 二维坐标 + 双重循环 + 数学规律观察。
这道题有很多种解法,本讲解是以官方参考程序,对照讲解的。