题目:

小 A 想绘制一个菱形。具体来说,需要绘制的菱形是一个 n 行 n 列的字符画,n 是一个大于 1 的奇数。菱形的四个顶点依次位于第 1 行、第 1 列、第 n 行、第 n 列的正中间,使用 # 绘制。相邻顶点之间也用 # 连接。其余位置都是 .

..#..
.#.#.
#...#
.#.#.
..#..
给定 n,请你帮小 A 绘制对应的菱形。

输入描述

一行,一个正整数 n。

输出描述

输出共 n 行,表示对应的菱形。

以下为实例输入(输出)

用例输入 1 

3

用例输出 1 

.#.
#.#
.#.

1.首先分解题目(一句一句的拆,慢慢来)

1.绘制菱形

2.需要绘制的菱形是一个 n 行 n 列的字符画

3.n 是一个大于 1 的奇数

4.菱形的四个顶点依次位于第 1 行、第 1 列、第 n 行、第 n 列正中间,使用#绘制

5.其余都用‘.’

2.建立基本内容,包括头文件,main函数,返回值。

#include<iostream>
using namespace std;
int main() {
    
     return 0;
}

3.建立变量n和判断中间的mid

#include<iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    int mid = n / 2;
     return 0;
}

4.搭建for循环

for (int i = 0;i <= n;i++){
    for (int j = 0;j <= n;j++){

    }
}

5.运用绝对值abs完成判断并输出

int dist = abs(i - mid) + abs(j - mid);
if (dist == mid) {
    cout << '#';
} else {
    cout << '.';

(不要忘了abs头文件)

#include <cstdlib>

6.换行输出

cout << endl;

———————————————————————————————————————————

这时有人问了:

浏览者:第五个看不懂怎么办,能不能解析一下。

1. 变量含义

  • i:当前行号(从 0 开始)

  • j:当前列号(从 0 开始)

  • mid:中心点的索引,mid = n / 2(因为 n 是奇数,所以中心点恰好是整数位置)

2. 数学意义

abs(i - mid) 表示当前行到中心行的垂直距离
abs(j - mid) 表示当前列到中心列的水平距离

两者相加,得到的就是从点 (i, j) 到中心点 (mid, mid) 的曼哈顿距离

3. 为什么用曼哈顿距离判断菱形边界?

对于中心在 (mid, mid) 的菱形,其边界上的点到中心的曼哈顿距离是一个固定值,这个值就是 mid

验证:

  • 顶点 (0, mid):距离 = |0-mid| + |mid-mid| = mid ✅

  • 顶点 (mid, 0):距离 = |mid-mid| + |0-mid| = mid ✅

  • 顶点 (n-1, mid):距离 = |n-1-mid| + |mid-mid| = mid ✅

  • 顶点 (mid, n-1):距离 = |mid-mid| + |n-1-mid| = mid ✅

  • 边上其他点:距离也都等于 mid

而菱形内部或外部的点,曼哈顿距离不等于 mid。

4. 判断逻辑

if (dist == mid) {
    cout << '#';
} else {
    cout << '.';
}
  • 如果 dist == mid,说明这个点恰好在菱形的边界上,画 #

  • 否则画 .

5. 举例 n=5,mid=2

位置 (i,j) |i-2| |j-2| dist 是否边界
(0,2) 2 0 2 ✅ 是
(1,1) 1 1 2 ✅ 是
(1,3) 1 1 2 ✅ 是
(2,0) 0 2 2 ✅ 是
(2,2) 0 0 0 ❌ 否
(0,0) 2 2 4 ❌ 否

这正是我们需要的菱形边界。

最后完整代码如下 |

                              |

                        \     |     /

                           \  |  /

#include <iostream>
#include <cstdlib>  // 包含 abs 的整数版本
using namespace std;

int main() {
    int n;
    cin >> n;
    int mid = n / 2;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            int dist = abs(i - mid) + abs(j - mid);
            if (dist == mid) {
                cout << '#';
            } else {
                cout << '.';
            }
        }
        cout << endl;
    }

    return 0;
}

再见!!!!!!!!!!!!!!!!!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐