洛谷 B4412:[GESP202509 二级] 菱形 ← 模拟算法

【题目来源】
https://www.luogu.com.cn/problem/B4412

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

..#..
.#.#.
#...#
.#.#.
..#..

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

【输入格式】
一行,一个正整数 n。

【输出格式】
输出共 n 行,表示对应的菱形。

【输入样例】
9

【输出样例】

....#....
...#.#...
..#...#..
.#.....#.
#.......#
.#.....#.
..#...#..
...#.#...
....#....

【数据范围】
对于所有测试点,保证 3≤n≤29 并且 n 为奇数。

【算法分析】
本题关键点在于找规律。
● 在算法代码一中,若令 mid=n/2+1,则在 1~mid 行,j=mid±(i-1) 的位置为字符 ‘#’。在 mid+1~n 行,j=mid±(i-n) 的位置为字符 ‘#’。
● 在算法代码二中,有个更完美的规律:若令 mid=n/2+1,且 abs(i-mid)+abs(j-mid)==mid-1,则位置 (i,j) 处为字符 ‘#’。

【算法代码一】

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin>>n;
    int mid=n/2+1;
    for(int i=1; i<=n; i++) {
        if(i<=mid) {
            for(int j=1; j<=n; j++) {
                if(j==mid-i+1 || j==mid+i-1) {
                    cout<<"#";
                } else cout<<".";
            }
            cout<<endl;
        }

        if(i>mid) {
            for(int j=1; j<=n; j++) {
                if(j==mid-i+n || j==mid+i-n) {
                    cout<<"#";
                } else cout<<".";
            }
            cout<<endl;
        }

    }

    return 0;
}

/*
in:
3

out:
.#.
#.#
.#.
*/

【算法代码二】

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin>>n;
    int mid=n/2+1;
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++) {
            if(abs(i-mid)+abs(j-mid)==mid-1) {
                cout<<"#";
            } else cout<<".";
        }
        cout<<endl;
    }

    return 0;
}

/*
in:
3

out:
.#.
#.#
.#.
*/




【参考文献】
https://www.luogu.com.cn/problem/solution/B4412

 

posted @ 2025-11-21 12:21  Triwa  阅读(183)  评论(0)    收藏  举报