AcWing 727. 菱形 曼哈顿距离

输入一个奇数 n,输出一个由 * 构成的 n阶实心菱形。

输入格式

一个奇数 n。

输出格式

输出一个由 * 构成的 n阶实心菱形。

具体格式参照输出样例。

数据范围

1≤n≤99

输入样例:
5
输出样例:
  *  
 *** 
*****
 *** 
  *  
#include<iostream>
#include<cstdio>

using namespace std;

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

    char s[n][n];

    // 输入空格
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < n; j ++ )
            s[i][j] = ' ' ;

    // 上半部分
    for (int i = 0; i < x; i ++ )
        for (int j = x - i; j <= x + i; j ++ )
            s[i][j] = '*';

    // 中间一行
    for (int j = 0; j < n; j ++ )
        s[x][j] = '*';

    // 下半部分
    for (int i = x + 1; i < n; i ++ )
        for (int j = i - x; j < n - i + x; j ++ )
            s[i][j] = '*';

    // 输出
    for (int i = 0; i < n; i ++ )
    {
        for (int j = 0; j < n; j ++ )
            cout << s[i][j] ;
        cout << endl;
    }

    return 0;
}

算法
到中心单元的曼哈顿距离

在二维空间中 i,j
两点的曼哈顿距离可以表示为 d(i,j)=|xi−xj|+|yi−yj|

(横、纵坐标差值的绝对值之和)。

此题目可认为是使得到中心单元的曼哈顿距离满足一定条件即打印星号。

上图示例输入为 n=5
时的情况,使用不同颜色区分各单元到中心单元的曼哈顿距离。输入奇数 n,坐标 (n/2,n/2) 表示 n∗n

方阵中的中心单元。

对于满足题目条件的任意菱形,总是会出现相似的结构。菱形即为与此 n∗n
方阵中心的曼哈顿距离不超过 n/2

的所有单元的集合。

因此,打印‘*’的判断条件是 abs(i−n/2)+abs(j−n/2)<=n/2。

#include <iostream>
using namespace std;

int main()
{
    int n;
    scanf("%d", &n);
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<n;++j)
        {
            if(abs(i-n/2)+abs(j-n/2)<=n/2) printf("*");
            else printf(" ");
        }
        puts("");
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值