输入一个奇数 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;
}