第三部分 编程题第二题《钻石王国里的神奇菱形》第一幕钻石王国1、很久很久以前。程序王国举行了一场比赛。国王说今天我们不用画笔。只允许用两个字符。 .要求画出一颗漂亮的钻石菱形。2、例如.... ... ... ... ....画的是不是很规则第二幕先观察规律假设n 31、画布有多大很多同学第一反应3×3其实不是2、题目要求2*n-1所以2×3-15画布大小5 × 53、我们给画布加上坐标。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、汉克老师让大家算134 224 314哇全部都是43、而n3所以n1 44、我们找到一个规律第一条边的条件是ijn1第五幕第二条边1、接下来(1,3) (2,4) (3,5)2、我们继续算3-12 4-22 5-323、我们又找到一个规律j-in-1第六幕继续看第三条边1、接下来(3,5) (4,4) (5,3)计算358 448 538都是82、我们又找到一个规律3*n-1 8所以第三条的条件为ij3*n-1第七幕第四条边1、再看看(3,1) (4,2) (5,3)2、计算3-12 4-22 5-32全部一样2、而n-1 2于是第三条边的条件为i-jn-1第八幕四位守卫集合1、于是一个点什么时候画2、答案1只要属于四条边中的任何一条。if( ijn1 || ij3*n-1 || i-jn-1 || j-in-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; }第十一幕我们要学会的思想汉克老师希望大家不要只记住ij...真正应该学会的是第一步先建立坐标。(1,1) (1,2) (1,3) ……第二步找规律。不要急着写代码。先看看哪些数字一直不变例如ij是不是一样或者i-j是不是一样第三步把规律变成条件。例如ij4就写成if(ij4)程序就会自动画出来。 本题知识树字符图形 │ ├── 双重for遍历画布 │ ├── 建立坐标(i,j) │ ├── 找规律 │ │ │ ├── ij不变 │ └── i-j不变 │ ├── 四条边 │ └── if判断输出字符 记忆口诀画图先画坐标盘双层循环慢慢看。加法减法找规律四条边界最关键。找到不变写条件字符图形不再难 这道题真正的考点这道题看似是在画菱形其实真正考查的是二维坐标 双重循环 数学规律观察。这道题有很多种解法本讲解是以官方参考程序对照讲解的。