B4554 [GESP202606 二级] 菱形

题目描述

给定正整数 nnn,在 (2n−1)×(2n−1)(2n - 1) \times (2n - 1)(2n1)×(2n1) 个网格的画布中,使用字符画一个边长为 nnn 个网格的菱形。其中,空白网格使用 ⋅\cdot 表示,菱形边所在的网格用 +++ 表示。

例如当 n=3n = 3n=3 时,图形如下:

..+..
.+.+.
+...+
.+.+.
..+..

输入格式

输入一个正整数 nnn

输出格式

输出 2n−12n - 12n1 行,表示按要求画的菱形。

输入输出样例 #1

输入 #1

4

输出 #1

...+...
..+.+..
.+...+.
+.....+
.+...+.
..+.+..
...+...

说明/提示

数据范围

3≤n≤153 \le n \le 153n15

解析

这道题跟去年(25年)9月份的题几乎是一样的。

解法一,矩阵中左上到右下的斜线,行和列的差相等,右上到左下的斜线,行和列的和相等。判断是否位于四条斜线上,是就打印+,不是就打印’.',详见代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,m;
    cin>>n;
    n=n*2-1;
    m=n/2+1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if (i+j==m+1||i-j==m-1||j-i==m-1||i+j==m*3-1){
                cout<<'+';
            }else{
                cout<<'.';
            }
        }
        cout<<endl;
    }
	return 0;
}

解法二,做一个二维的字符数组,在数组中依次把四条线写进去,然后打印整个数组,详见代码:

#include<bits/stdc++.h>
using namespace std;
char a[105][105];
int n;
int main(){
    cin>>n;
    n=n*2-1;
    for(int j=n/2+1,i=1;j>=1;j--,i++){
        a[i][j]='+';
    }
    for(int j=n/2+1,i=1;j<=n;j++,i++){
        a[i][j]='+';
    }
    for(int i=n/2+1,j=1;i<=n;j++,i++){
        a[i][j]='+';
    }
    for(int i=n/2+1,j=n;i<=n;j--,i++){
        a[i][j]='+';
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if (a[i][j]==0){
                cout<<'.';
            }else{
                cout<<a[i][j];
            }
        }
        cout<<endl;
    }
	return 0;
}
Logo

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

更多推荐