题目描述:
输入一个奇数 n,输出一个由 * 构成的 n 阶实心菱形。
输入格式:
一个奇数 n。
输出格式:
输出一个由 * 构成的 n 阶实心菱形。
具体格式参照输出样例。
数据范围
1≤n≤99
输入样例:
5
输出样例:
*
***
*****
***
*
解题思路:
其实这道题本质应该是在考察我们一个叫到中心单元的哈夫曼距离算法的理解度吧。
什么个意思呢?
在二维空间中 i,j两点的哈夫曼距离可以这样表示:
d(i,j) = Math.abs( xi - xj ) + Math.abs( yi - yj )
//即就是:横、纵坐标差值的绝对值之和
此题可以认为是是得到中心单元的哈弗曼顿距离满足一定的条件即可打印星号
具体如下图所示:
上图实例输入为 n = 5 的情况,使不同颜色区分各单元到中心单元的哈曼顿距离。输入奇数 n ,坐标( n/2 , n/2),表示 n*n 方阵 的中心单元。
对于满足以上条件的的任意菱形,总是会出现相似的结构。菱形即为与此 n x n 方阵中心的哈夫曼距离不超过 n/2 的所有单元的集合。
因此打印 * 的判断条件是 Math.abs(i - n/2) + Math.abs(j - n/2) <= n/2
代码如下:
public class LingFrom {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if (n % 2 == 0){
return;
}
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if((Math.abs(i - n/2)+Math.abs(j-n/2)) <= n/2){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println(" ");
}
}
}
运行结果如下: