ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

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

洛谷 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:
3out:
.#.
#.#
.#.
*/

【算法代码二】

#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:
3out:
.#.
#.#
.#.
*/




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

 

返回列表