



这道题是在考察一个非常重要的能力:
⭐ 二维坐标思维(i 行 j 列)
这是很多编程题(图形打印、棋盘、地图、迷宫)都会用到的基础。
一、故事:小画家画正方形
1、有一天,小画家 Bob 想画一个正方形框。
2、他准备了四种"画笔":
| 符号 | 用途 |
|---|---|
| + | 四个角 |
| - | 上下边 |
| | | 左右边 |
| * | 内部填充 |
3、例如输入
5
4、画出的图是:
+---+
|***|
|***|
|***|
+---+
二、观察图形规律
我们先看看这个 5×5 图。
给它标上 行号 i 和 列号 j:
(0,0) (0,1) (0,2) (0,3) (0,4)
(1,0) (1,1) (1,2) (1,3) (1,4)
(2,0) (2,1) (2,2) (2,3) (2,4)
(3,0) (3,1) (3,2) (3,3) (3,4)
(4,0) (4,1) (4,2) (4,3) (4,4)
三、四个角的位置
1、四个角是:
(0,0)
(0,n-1)
(n-1,0)
(n-1,n-1)
2、例如 n=5:
(0,0) (0,4)
(4,0) (4,4)
这些位置输出:
+
四、上下边
1、第一行和最后一行:
i == 0
i == n-1
2、但是 角已经画了。
所以剩下的位置画:
-
3、画完是:
+---+
五、左右边
1、第一列和最后一列:
j == 0
j == n-1
2、但不是角的位置。
画:
|
3、画完是:
+
|
|
|
+
六、内部区域
1、剩下的地方:
*
2、画完是:
|***|
七、完整逻辑
1、我们要检查每个位置:
(i , j)
2、按顺序判断:
(1)第1种:角
(i==0 || i==n-1)
AND
(j==0 || j==n-1)
输出:
+
(2)第2种:上下边
i==0 || i==n-1
输出:
-
(3)第3种:左右边
j==0 || j==n-1
输出:
|
(4)第4种:内部
输出:
*
八、程序结构
因为是 n 行 n 列
所以必须用:
双重循环
for(i)
for(j)
九、完整程序
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(j==0 || j==n-1)
{
if(i==0 || i==n-1)
cout<<'+';
else
cout<<'|';
}
else
{
if(i==0 || i==n-1)
cout<<'-';
else
cout<<'*';
}
}
if(i!=n-1)
cout<<endl;
}
return 0;
}
十、程序运行示例
1、输入:
4
2、程序运行:
| i | j | 输出 |
|---|---|---|
| 0 | 0 | + |
| 0 | 1 | - |
| 0 | 2 | - |
| 0 | 3 | + |
3、结果:
+--+
|**|
|**|
+--+
十一、理解口诀
这道题记住四句话:
口诀1
四个角就填:
+
口诀2
上下边就填:
-
口诀3
左右边就填:
|
口诀4
中间就填:
*
十二、考试最常见错误
错误1
忘记写 双重循环
必须:
for i
for j
错误2
角和边顺序写错。
如果先判断:
i==0
就会把角也当成边。
十三、这题真正考什么
这题是 GESP 二级很重要的图形题模型:
⭐ 坐标判断模型
i 行
j 列
判断:
边界
内部
角
十四、课后练习
练习1
打印空心矩形
*****
* *
* *
*****
练习2
棋盘
#.#.
.#.#
#.#.
.#.#
练习3
菱形
*
***
*****
*******
*****
***
*